在Python中展平浅层列表是否有一种简单的方法可以使用列表推导来展平迭代列表,或者失败,你会认为什么是平衡这样的浅层列表,平衡性能和可读性的最佳方法?我尝试使用嵌套列表理解来压缩这样的列表,如下所示:[image for image in menuitem for menuitem in list_of_menuitems]但我在NameError那里遇到麻烦,因为name 'menuitem' is not defined。谷歌搜索并浏览Stack Overflow后,我得到了一个reduce声明所需的结果:reduce(list.__add__, map(lambda x: list(x), list_of_menuitems))但是这个方法相当难以理解,因为我需要那个list(x)调用,因为x是一个Django QuerySet对象。结论:感谢所有为此问题做出贡献的人。以下是我学到的内容摘要。我也将其作为社区维基,以防其他人想要添加或更正这些观察结果。我原来的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如下所示来避免*操作员魔法可能是更好的风格:>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])>>> print(list(chain))>>> [1, 2, 3, 5, 89, 6]
4 回答
紫衣仙女
TA贡献1839条经验 获得超15个赞
你几乎拥有它!该做的嵌套列表理解的方式是把for
语句以相同的顺序,因为他们会去正规的嵌套for
语句。
因此,这
for inner_list in outer_list: for item in inner_list: ...
对应于
[... for inner_list in outer_list for item in inner_list]
所以你要
[image for menuitem in list_of_menuitems for image in menuitem]
HUH函数
TA贡献1836条经验 获得超4个赞
sum(list_of_lists, [])
会使它变平。
l = [['image00', 'image01'], ['image10'], []]print sum(l,[]) # prints ['image00', 'image01', 'image10']
GCT1015
TA贡献1827条经验 获得超4个赞
此解决方案适用于任意嵌套深度 - 不仅仅是“列表列表”深度,其他解决方案的一些(全部?)仅限于:
def flatten(x): result = [] for el in x: if hasattr(el, "__iter__") and not isinstance(el, basestring): result.extend(flatten(el)) else: result.append(el) return result
它是允许任意深度嵌套的递归 - 直到你达到最大递归深度,当然......
添加回答
举报
0/150
提交
取消