SORU
2 Ocak 2009, Cuma


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
2 Ocak 2009, Cuma


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 QuerySets, 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GenTechPC

    GenTechPC

    1 Temmuz 2007
  • Kim Barbin

    Kim Barbin

    3 Mayıs 2012
  • Simon Hayter

    Simon Hayter

    20 HAZİRAN 2010