2016-03-10 9 views
11

आप इस तरह के रूप में सूची, की एक सूची के माध्यम से कैसे पुनरावृति होगी सूचकांक अनुक्रम में एक नई सूची बनाने के लिए की सूची के माध्यम:अजगर दोहराएं सूची

[[1,2,3,4], [5,6], [7,8,9]] 

और प्रत्येक सूची के पहले आइटम हथियाने से एक नई सूची का निर्माण , तो दूसरा, आदि तो ऊपर इस हो जाता है:

[1, 5, 7, 2, 6, 8, 3, 9, 4] 

उत्तर

12

आप एक सूची समझ itertools.izip_longest के साथ (या zip_longest अजगर 3 में) का उपयोग कर सकते

from itertools import izip_longest 
a = [[1,2,3,4], [5,6], [7,8,9]] 
[i for sublist in izip_longest(*a) for i in sublist if i is not None] 
# [1, 5, 7, 2, 6, 8, 3, 9, 4] 
+4

आप किसी भी 0 को खो देंगे, आपको किसी भी –

+0

की जांच करनी चाहिए यदि आपका नाम 'j'' को अधिक पठनीय तरीके से बदल दिया गया है, जैसे 'result_with_holes' या कुछ। – 9000

+1

@ पैड्राइक कनिंघम राइट, इसे ठीक किया गया। –

6

जब तक कि आप जानते हैं कि None दिखाई नहीं देगा, आप का लाभ ले सकते है कि कैसे कोई समारोह के साथ map() काम करता है:

outlist = [y for sub in map(None, *inlist) for y in sub if not y is None] 
+0

नोट: यह पायथन 3 में काम नहीं करेगा। –

+0

@pp_: अच्छा बिंदु। मुझे आश्चर्य है कि वे इसे क्यों ले जाएंगे। – zondo

4

सूखी: itertools एक नुस्खा है कि सही इस कार्य के लिए लग रहा है: roundrobin

from itertools import cycle, islice 

def roundrobin(*iterables): 
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C" 
    # Recipe credited to George Sakkis 
    pending = len(iterables) 
    nexts = cycle(iter(it).next for it in iterables) 
    while pending: 
     try: 
      for next in nexts: 
       yield next() 
     except StopIteration: 
      pending -= 1 
      nexts = cycle(islice(nexts, pending)) 

l = [[1,2,3,4], [5,6], [7,8,9]] 

print (list(roundrobin(*l))) 
#[1, 5, 7, 2, 6, 8, 3, 9, 4] 
+0

यह केवल पायथन 2 के लिए है, पाइथन 3 संस्करण [यहां] (https://docs.python.org/3/library/itertools.html) पाया जा सकता है। –

+0

आप सही हैं, @pp_, पायथन 2 विशेषता 'अगली' का उपयोग करता है और पायथन 3 '__next__' का उपयोग करता है। – chapelo

+0

मुझे लगता है कि 'अगला (iter (it))' दोनों के लिए काम करेगा, है ना? – Paul

1

आप यदि आप नहीं चाहते हैं तो किसी भी आयात का उपयोग किए बिना इसे मैन्युअल रूप से कर सकते हैं।

एन अलग काउंटर रखें जहां एन आपकी सूची में सूचियों की संख्या है और जब भी आप उस उपन्यासकारों से नया तत्व जोड़ते हैं तो उन्हें बढ़ाएं। उन्हें जोड़ने के दौरान आपको यह नियंत्रित करना चाहिए कि संबंधित सेट काउंटर अन्य सभी काउंटरों का न्यूनतम होना चाहिए यदि सभी सूचियों में तत्व शेष हैं। जब आप सूची का अंतिम तत्व जोड़ते हैं तो आप हमारे न्यूनतम नियम की रक्षा के लिए 99 99 जैसे कुछ के प्रति अपने काउंटर को बढ़ा सकते हैं।

यह लागू करना कठिन होगा और मैं आपको इस तरह से लागू करने का सुझाव नहीं देता हूं लेकिन यह भी संभावना है कि आप कुछ भी आयात नहीं करना चाहते हैं या अपने स्तर के लिए प्रोग्रामिंग चुनौती चाहते हैं।

0

None फ़िल्टर करने वाले समाधान None पर काम नहीं करेंगे यदि आप रख सकते हैं कि उपन्यासकारों का एक मूल्य है। इसे ठीक करने के लिए, आप एक सूची समझ कर सकते हैं जो सबसे लंबे समय तक उपन्यासकार के सूचकांक पर पुनरावृत्त करता है, और अगर सूचकांक सीमा में है तो केवल सुस्त आइटम जोड़ता है।

a = [[1,2,3,4],[5,6,None],[7,8,9]] 
range_longest = range(max(map(len, a))) 
[sublist[i] for i in range_longest for sublist in a if i < len(sublist)] 
# [1, 5, 7, 2, 6, 8, 3, None, 9, 4] 
संबंधित मुद्दे