Python’da sığ bir listeyi düzleştirme

| | | | | | | | | | | | | |

Yinelenebilirler listesini bir liste kavrayışıyla düzleştirmenin basit bir yolu var mı, yoksa bunda başarısız olursa, performans ve okunabilirliği dengeleyerek bunun gibi sığ bir listeyi düzleştirmenin en iyi yolu olarak ne düşünürdünüz?

Böyle bir listeyi iç içe liste anlayışıyla düzleştirmeye çalıştım, şöyle:

[image for image for menuitem in list_of_menuitems] 

Ama orada NameError çeşidiyle başım belaya giriyor, çünkü "menuitem" adı tanımlanmadı. Googling yapıp Stack Overflow'a baktıktan sonra, bir reduce ifadesi ile istenen sonuçları aldım:

reduce(list.__add__, map(lambda x: list(x) ), list_of_menuitems)) 

Fakat bu yöntem oldukça okunamıyor çünkü x bir Django QuerySetlist(x) çağrısına ihtiyacım var. code> nesne.

Sonuç:

Bu soruya katkıda bulunan herkese teşekkürler. İşte öğrendiklerimin bir özeti. Başkalarının bu gözlemlere ekleme yapmak veya bu gözlemleri düzeltmek istemesi ihtimaline karşı bunu bir topluluk wiki'si yapıyorum.

Orijinal redüksiyon ifadem gereksiz ve şu şekilde yazılması daha iyi:

>>> küçült(list.__add__, (list_of_menuitems içindeki mil için list(mi)) 

Bu, iç içe liste kavraması için doğru sözdizimidir (Mükemmel özet dF!):

>>> [resim için list_of_menuitems içindeki mi için resim in mi] 

Ancak bu yöntemlerin hiçbiri itertools.chain kullanmak kadar verimli değildir:

>>> ; itertools'dan import chain >>> list(chain(*list_of_menuitems)) 

Ve @cdleary'nin belirttiği gibi, < kullanarak * operatör büyüsünden kaçınmak muhtemelen daha iyi bir stildir. code>chain.from_iterable şöyle:

>>> zincir = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]]) >gt;>> print(list(zincir)) >>> [1, 2, 3, 5, 89, 6]