2016-03-10 26 views
11

nasıl gibi listeleri, listesi içinde yineleme olur endeksi dizide yeni bir liste yapmak için listenin listeyi:Python Uygulayın

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

ve her listenin ilk öğeyi kapma tarafından yeni bir liste oluşturmak vb sonra ikinci, Yani yukarıda bu haline gelir:, sen yararlanabilirsiniz sürece bildiğiniz gibi None görünmeyeceğini

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

cevap

12

Sen (Python 3 veya zip_longest) itertools.izip_longest ile birlikte bir liste anlama kullanabilirsiniz

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

herhangi 0'lar kaybedecek, size result_with_holes' falan 'gibi' bir daha okunabilir şekilde j' adını ederseniz örnek daha iyi olurdu –

+0

Yok kontrol etsinler. – 9000

+1

@PadraicCunningham Doğru, düzeltildi. –

6

nasıl hiçbir fonksiyonu ile map() çalışır:

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

Not: Bu, Python 3'te çalışmayacaktır. –

+0

@pp_: İyi nokta. Bunu neden başaracaklarını merak ediyorum. – zondo

4

KURU: itertools sağ bu görev için sesler bir tarifi vardır: 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

sadece Python 3 versiyonu Bu Python 2 içindir bulunabilir [buradan] (https://docs.python.org/3/library/itertools.html). –

+0

Haklısınız, @pp_, python 2, 'next' özniteliğini kullanır ve python 3, '__next__' kullanır. – chapelo

+0

Sanırım bir sonraki (iter (it)) her ikisi için de çalışırdı, değil mi? – Paul

1

Sen istemiyorsanız, herhangi bir ithalat kullanmadan el ile yapabilirsiniz.

n Listenizde listelerinin sayısıdır N farklı sayaçlar tutun ve sublists bundan yeni bir öğe eklemek zaman onları artırır. Onları eklerken Listenin son öğe eklemek elements.When sen bizim asgari üstünlüğünü koruyan 9999 gibi bir şey onun sayacını artırmak tüm listeler kalan varsa o ayrı kümeler sayacı tüm diğer sayaçların asgari olmalıdır kontrol edilmelidir.

Bu uygulamaya zor olacak ve ben bu şekilde uygulamaya önermiyoruz ama bu da bir şey almak ya da seviyesi için bir programlama meydan istiyorum istemiyorsanız eğer bir olasılık. None saklamak istiyorum sublists bir değer ise çalışmayacaktır None filtrelemek

0

çözümleri. Bunu düzeltmek için, en uzun alt listenin indisleri üzerinde yinelenen bir liste kavrama yapabilir ve sadece indeks menzilde ise alt liste öğeleri ekleyebilir.

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]