python-3.x - 将列表推导转换为嵌套循环会导致无限循环
问题描述
我有一个示例代码,如下所示:
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
部分有关(可能需要添加一个充当处理程序或其他东西的条件),但我似乎无法弄清楚。
解决方案
如果您查看您的列表理解代码,您会看到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
推荐阅读
- python - 使用 mkdir 创建目录并在 python 中循环时出错
- python - 使用 Python Flask 将文件上传到 IBM COS
- json - 无法在 Swift 中展开和折叠 TableViewCell
- angular - 根据angularJS v1.4.8中的值隐藏剑道网格列
- asp.net-core - 如何在 GraphQL .Net Core 中进行授权?
- javascript - 如何在 ChartJS 中插入标签而不重新缩放其他标签?
- python - 搜索和拆分列表
- amazon-web-services - 录制 wav 并将其上传到 Amazon S3
- python - 为 R 安装库并遇到“Rcpp”问题
- jenkins - jenkins 无法拉取分叉存储库上的提交