擅长:python、mysql、java
<p>我认为表达式<code>[(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]</code>中唯一令人困惑的部分是隐藏了一个隐式<code>flatten</code>操作。在</p>
<p>让我们先考虑一下表达式的简化版本:</p>
<pre><code>def even(x):
return x % 2 == 0
def odd(x):
return not even(x)
c = map(lambda x: map(lambda y: [x, y],
filter(odd, range(5))),
filter(even, range(5)))
print(c)
# i.e. for each even X we have a list of odd Ys:
# [
# [[0, 1], [0, 3]],
# [[2, 1], [2, 3]],
# [[4, 1], [4, 3]]
# ]
</code></pre>
<p>然而,我们需要的是完全相同但扁平化的列表<code>[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]</code>。在</p>
<p>从<a href="https://docs.python.org/3/library/itertools.html#itertools-recipes" rel="nofollow noreferrer">official python docs</a>我们可以得到<code>flatten</code>函数的示例:</p>
^{pr2}$
<p>它基本上相当于以下列表理解表达式:</p>
<pre><code>flattened = [x for sublist in c for x in sublist]
print(flattened)
# ... which is basically an equivalent to:
# result = []
# for sublist in c:
# for x in sublist:
# result.append(x)
</code></pre>