首页 > 解决方案 > 将列表推导转换为嵌套循环会导致无限循环

问题描述

我有一个示例代码,如下所示:

outputs = ['']
for ch in "abc":
    outputs = [i+j for i in outputs for j in [ch.upper(), ch.lower()]]
    print(outputs) # Debugging purposes

输出如下所示:

['A', 'a']
['AB', 'Ab', 'aB', 'ab']
['ABC', 'ABc', 'AbC', 'Abc', 'aBC', 'aBc', 'abC', 'abc']

我认为嵌套的 for 循环版本看起来像这样:

outputs=['']
for ch in "abc":
    for i in outputs:
        for j in [ch.upper(),ch.lower()]:
            outputs.append(i+j)
            print(outputs) # Debugging purposes

然而,输出实际上是一个无限循环:

['', 'A']
['', 'A', 'a']
['', 'A', 'a', 'AA']
['', 'A', 'a', 'AA', 'Aa']
['', 'A', 'a', 'AA', 'Aa', 'aA']
['', 'A', 'a', 'AA', 'Aa', 'aA', 'aa']
['', 'A', 'a', 'AA', 'Aa', 'aA', 'aa', 'AAA']
['', 'A', 'a', 'AA', 'Aa', 'aA', 'aa', 'AAA', 'AAa']
['', 'A', 'a', 'AA', 'Aa', 'aA', 'aa', 'AAA', 'AAa', 'AaA']
['', 'A', 'a', 'AA', 'Aa', 'aA', 'aa', 'AAA', 'AAa', 'AaA', 'Aaa']
['', 'A', 'a', 'AA', 'Aa', 'aA', 'aa', 'AAA', 'AAa', 'AaA', 'Aaa', 'aAA']
['', 'A', 'a', 'AA', 'Aa', 'aA', 'aa', 'AAA', 'AAa', 'AaA', 'Aaa', 'aAA', 'aAa']
['', 'A', 'a', 'AA', 'Aa', 'aA', 'aa', 'AAA', 'AAa', 'AaA', 'Aaa', 'aAA', 'aAa', 'aaA']
['', 'A', 'a', 'AA', 'Aa', 'aA', 'aa', 'AAA', 'AAa', 'AaA', 'Aaa', 'aAA', 'aAa', 'aaA', 'aaa']
. . .

我相信它与该for i in outputs部分有关(可能需要添加一个充当处理程序或其他东西的条件),但我似乎无法弄清楚。

标签: python-3.x

解决方案


如果您查看您的列表理解代码,您会看到outputs循环的每次迭代都会覆盖它。但是在嵌套循环代码的情况下,outputs继续扩展。因此,第二个循环将不得不循环更多次。

另一个问题是,在嵌套循环代码中,您为内部循环的每次迭代打印一次(换句话说,无论何时append()调用),而在列表组合代码中,您为最外层循环的每次迭代都打印一次。

可以借助像这样的另一个列表来实现正确的结果 -

outputs=['']
for ch in "abc":
    temp = [] # temporary list
    for i in outputs:
        for j in [ch.upper(),ch.lower()]:
            temp.append(i+j)
    outputs = temp # overwrite outputs
    print(outputs) # print only once per iteration of outer loop

推荐阅读