看一个嵌套循环的例子。在处理算法时,必须使用两个占位符迭代序列是很常见的。第一个版本从左到右贯穿整个序列。第二个 1 个也是如此,但它从第一个 1 开始,而不是 0。这个概念是测试所有对而不重复。让我们看看经典的 for 循环等效项:
# pairs.for.loop.py
items = 'ABCD'
pairs = []
for a in range(len(items)):
for b in range(a, len(items)):
pairs.append((items[a], items[b]))
输出:
$ python pairs.for.loop.py
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'B'), ('B',
'C'), ('B', 'D'), ('C', 'C'), ('C', 'D'), ('D', 'D')
所有具有相同字母的元组都是 b 与 a 位于同一位置的元组。现在,让我们看看如何将其转换为列表推导式:
# pairs.list.comprehension.py
items = 'ABCD'
pairs = [(items[a], items[b])
for a in range(len(items)) for b in range(a, len(items))]
这个版本只有两行长,达到了相同的结果。请注意,在这种特殊情况下,由于 b 上的 for 循环依赖于 a,因此在推导式中,它必须遵循 a 上的 for 循环。如果交换它们,会出现错误。