Sığ bir listesi düzleştirme Python
Orada basit bir şekilde dümdüz bir listesi iterables bir liste üreteci, ya da başarısız olduğunu, ne olacağını hepiniz düşünün en iyi şekilde dümdüz sığ bir liste gibi bu, dengeleme performansı ve okunabilirliği?
Böyle iç içe geçmiş bir liste anlayışı ile böyle bir liste dümdüz etmeye çalıştım.:
[image for image in menuitem for menuitem in list_of_menuitems]
Ama name 'menuitem' is not defined
NameError
çeşitli sorun yok. Googling ve etrafında bir Yığın Taşması üzerine baktıktan sonra, reduce
ifadesi ile: istenen sonuçları aldım
reduce(list.__add__, map(lambda x: list(x), list_of_menuitems))
Ama bu yöntem list(x)
x QuerySet
nesne Django çünkü orada aramak lazım çünkü oldukça okunamaz.
Sonuç:
Bu soru için emeği geçen herkese teşekkürler. Burada öğrendiklerini bir özet. Ayrıca başkalarına eklemek veya bu gözlemler doğru ister diye bu topluluk wiki yapıyorum.
Orijinal azaltmak ifademi gereksiz olduğunu ve bu şekilde daha iyi yazılır:
>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))
Bu iç içe geçmiş bir liste kavrama (Parlak Özet dF!) için doğru sözdizimi aşağıdaki gibidir:
>>> [image for mi in list_of_menuitems for image in mi]
Ancak bu yöntemlerden hiçbiri itertools.chain
kullanmak kadar etkili
>>> from itertools import chain
>>> list(chain(*list_of_menuitems))
Ve @cdleary da belirttiği gibi, muhtemelen böyle * 18 *kullanarak* operatör sihirli önlemek için daha iyi tarzı:
>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])
>>> print(list(chain))
>>> [1, 2, 3, 5, 89, 6]
CEVAP
Sadece veri yapısı düzleştirilmiş bir versiyonu üzerinde yineleme, aradığınız değiştirilebilir uçlu bir dizi, itertools.chain and company düşünün.
>>> list_of_menuitems = [['image00', 'image01'], ['image10'], []]
>>> import itertools
>>> chain = itertools.chain(*list_of_menuitems)
>>> print(list(chain))
['image00', 'image01', 'image10']
Soru kullandığınız göründüğü Django. iterable QuerySet
s, içermelidir iterable bir şey, üzerinde çalışacak.
Düzenleme:Bu azaltmak aynı yükü genişletilmiş varlık listesine öğeleri kopyalama olacak, çünkü muhtemelen zaten azaltmak kadar iyi. chain
sonunda list(chain)
çalıştırırsanız (aynı) bu yükü tabi.
Meta-Düzenleme:Aslında, geçici ile orijinal uzatmak oluşturduğunuzda geçici listeler atmak çünkü daha az yük soru önerdiği çözüm değil.
Düzenleme:28* itertools.chain.from_iterable
*açma önler ve *
sihirli önlemek için kullanmanız gerekir, ama the timeit app ihmal edilebilir performans farkı gösterir.
Bulma öğenin dizin listesi Python içer...
Nasıl sözlük değerlere göre sözlükler ...
Nasıl klon ya da Python içinde bir lis...
Nasıl Python ederken bir listesi düzen...
Nasıl python listesi tersine çevirebil...