有沒有一種簡單的方法可以通過列表推導來展平可迭代列表,或者如果做不到這一點,你們都認為什麼是展平這樣的淺層列表、平衡性能和可讀性的最佳方法?
我嘗試使用嵌套列表理解來展平這樣的列表,如下所示:
[image for image for menuitem for menuitem in list_of_menuitems]
但是我遇到了 NameError
種類的麻煩,因為 name "menuitem" 沒有定義
。在谷歌搜索並查看 Stack Overflow 後,我通過 reduce
語句得到了想要的結果:
reduce(list.__add__, map(lambda x: list(x ), list_of_menuitems))
但是這個方法相當不可讀,因為我需要 list(x)
調用那裡,因為 x 是 Django QuerySet 對象。
結論:
感謝所有為這個問題做出貢獻的人。這裡是我學到的總結。如果其他人想要添加或更正這些觀察結果,我也會將此作為社區 wiki。
我原來的 reduce 語句是多餘的,最好這樣寫:
>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))
這是嵌套列表理解的正確語法(精彩總結 dF!):
>>> [image for mi in list_of_menuitems for image in mi]
但是這些方法都沒有使用 itertools.chain
高效:
>>> ; from itertools import chain >>> list(chain(*list_of_menuitems))
正如@cdleary所說,使用 chain.from_iterable
像這樣:
>>>鏈 = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])>>>打印(列表(鏈))>>> [1, 2, 3, 5, 89, 6]