列表推导式的一般形式可以这样理解
[(the task to be done) (how long it has to be done)]
我们通常在必须完成多长时间部分使用for循环,要完成的任务部分也可以有if条件。 需要注意的重要一点是,要完成的任务部分应该返回一个有效值(即使None 是一个有效值)。因此,您不能在列表推导中使用任何 Python 语句(return,在 Python 2.x 中为 print 等)。
现在回答你的第一个问题,
['a' if r == c else 'b' for c in range(3) for r in range(3)]
# ['a', 'b', 'b', 'b', 'a', 'b', 'b', 'b', 'a']
这完全创建了一个列表,正如您在 for 循环版本中显示的那样。
'a' if r == c else 'b'
这是一样的
if r == c:
'a'
else:
'b'
首先,将执行for c in range(3) 并生成列表[0, 1, 2],然后在每次迭代时执行for r in range(3) 并生成列表[0, 1, 2]。在r 的每次迭代中,我们上面看到的 if 条件都会被执行,if..else 的结果将被用作正在生成的新列表的元素。
要回答您的第二个问题,您可以很好地使用列表理解。
从上面的例子我们的基本理解是,列表推导就是生成一个列表。现在,让我们尝试嵌套列表推导(我们将在待完成的任务部分使用列表推导),像这样
[['a' if r == c else 'b' for r in range(3)] for c in range(3)]
# [['a', 'b', 'b'], ['b', 'a', 'b'], ['b', 'b', 'a']]
现在,如果您查看我们的嵌套列表理解,首先将执行 for c in range(3),然后将执行 ['a' if r == c else 'b' for r in range(3)] 部分,这将生成嵌套列表的各个行。这里需要注意的重要一点是,c 在嵌套列表理解中可用。