有没有一种简单的方法可以用列表理解来扁平化可迭代列表,或者如果不能做到这一点,你们都会认为什么是扁平化这样一个浅层列表的最好方法,以平衡性能和可读性呢?
我试图用嵌套的列表理解将这样的列表展平,如下所示:
[image for image in menuitem for menuitem in list_of_menuitems]
但我遇到了NameError
种的麻烦,因为name 'menuitem' is not defined
种.在谷歌搜索并查看堆栈溢出后,我用reduce
语句得到了想要的结果:
reduce(list.__add__, map(lambda x: list(x), list_of_menuitems))
但是这个方法非常不可读,因为我需要list(x)
调用,因为x是Django QuerySet
对象.
Conclusion:
感谢为这个问题做出贡献的每一个人.这是我所学知识的总结.我还将此设置为社区维基,以防其他人想要添加或更正这些观察到的内容.
我最初的reduce语句是多余的,最好这样写:
>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))
这是嵌套列表理解的正确语法(Brilliant summary 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
来避免*operator magic可能是更好的方式,比如:
>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])
>>> print(list(chain))
>>> [1, 2, 3, 5, 89, 6]