我有许多列表推导式,可以构建各种列表列表。为了保持简单,请考虑:
foo = []
for i in range(1,3): # dummy loop for the example
if len(foo) == 0:
foo = [[x] for x in (0, 1, -1)] # can I avoid this step?
else:
foo = [f + [x] for f in foo for x in (0, 1, -1)]
print(foo)
产生:
[[0, 0], [0, 1], [0, -1], [1, 0], [1, 1], [1, -1], [-1, 0], [-1, 1], [-1, -1]]
我知道还有其他方法使用 itertools 来产生这个特定的输出;我这里简化一下。关键是理解必须建立在自身之上,因此
for f in foo
。
我的具体问题是:有没有办法避免
if, else
代码并只在一行中执行此操作?
如果我只做 foo = [f + [x] for f in foo for x in (0, 1, -1)]
而没有 len(foo) == 0
的情况,我会得到一个空的 foo
。
您不需要参考正在构建的列表;只需使用两台发电机即可。
>>> [[x, y] for x in (-1, 0, 1) for y in (-1, 0, 1)]
[[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 0], [0, 1], [1, -1], [1, 0], [1, 1]]