是否有一种简单的方法可以使用列表推导来展平迭代列表,或者失败,你会认为什么是平衡这样的浅层列表,平衡性能和可读性的最佳方法?
我尝试使用嵌套列表理解来压缩这样的列表,如下所示:
[image for image in menuitem for menuitem in list_of_menuitems]
Run Code Online (Sandbox Code Playgroud)
但我在NameError那里遇到麻烦,因为name 'menuitem' is not defined.谷歌搜索并浏览Stack Overflow后,我得到了一个reduce声明所需的结果:
reduce(list.__add__, map(lambda x: list(x), list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
但是这个方法相当难以理解,因为我需要那个list(x)调用,因为x是一个Django QuerySet对象.
结论:
感谢所有为此问题做出贡献的人.以下是我学到的内容摘要.我也将其作为社区维基,以防其他人想要添加或更正这些观察结果.
我原来的reduce语句是多余的,用这种方式编写得更好:
>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
这是嵌套列表理解的正确语法(Brilliant summary dF!):
>>> [image for mi in list_of_menuitems for image in mi]
Run Code Online (Sandbox Code Playgroud)
但这些方法都不如使用效率高itertools.chain:
>>> from itertools import chain
>>> list(chain(*list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
正如@cdleary指出的那样,通过使用chain.from_iterable如下所示来避免*操作符魔术可能是更好的风格:
>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])
>>> print(list(chain))
>>> [1, 2, …Run Code Online (Sandbox Code Playgroud) 我有两个清单:
[a, b, c] [d, e, f]
我想:
[a, d, b, e, c, f]
在Python中执行此操作的简单方法是什么?
在itertools那里chain,它将多个生成器组合在一起,实质上是对它们进行深度优先迭代,即chain.from_iterable(['ABC', '123'])产生A,B,C,1,2,3.但是,没有广度优先版本,或者是我错过了什么?当然izip_longest,但是对于大量的发生器来说,这感觉很尴尬,因为元组会非常长并且可能非常稀疏.
我想出了以下内容:
def chain_bfs(*generators):
generators = list(generators)
while generators:
g = generators.pop(0)
try:
yield g.next()
except StopIteration:
pass
else:
generators.append(g)
Run Code Online (Sandbox Code Playgroud)
对我来说感觉有点冗长,是否有更多的Pythonic方法我错过了?这个功能是否适合加入itertools?
我有这个清单:
a = ["1 Monday","1 Wednesday","1 Friday"]
b = ["2 Tuesday","2 Thursday","2 Saturday"]
Run Code Online (Sandbox Code Playgroud)
我想将这些结合起来:
c = ["1 Monday", "2 Tuesday", "1 Wednesday", "2 Thursday", "1 Friday", "2 Saturday"]
Run Code Online (Sandbox Code Playgroud)
我想轮流做这个。因此,附加 a 的第一个元素和 b 的第一个元素,然后附加 a 的第二个元素和 b 的第二个元素,依此类推。