在 Python 中展平一個淺列表

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

有沒有一種簡單的方法可以通過列表推導來展平可迭代列表,或者如果做不到這一點,你們都認為什麼是展平這樣的淺層列表、平衡性能和可讀性的最佳方法?

我嘗試使用嵌套列表理解來展平這樣的列表,如下所示:

[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]