在Python中展平浅层列表

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


Cats萌萌
浏览 600回答 4
4回答

紫衣仙女

你几乎拥有它!该做的嵌套列表理解的方式是把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函数

sum(list_of_lists, []) 会使它变平。l = [['image00', 'image01'], ['image10'], []]print sum(l,[]) # prints ['image00', 'image01', 'image10']

GCT1015

此解决方案适用于任意嵌套深度 - 不仅仅是“列表列表”深度,其他解决方案的一些(全部?)仅限于: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它是允许任意深度嵌套的递归 - 直到你达到最大递归深度,当然......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python