gpt4 book ai didi

python - 名称错误在 python 中打印时消失

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:22 25 4
gpt4 key购买 nike

我试图用 python 编写代码来生成输入字符串的所有排列。

inp = raw_input()

out = [inp[0]]
for i in range(1,len(inp)):
#print [range(len(j)+1) for j in out]
out = [j[:k]+inp[i]+j[k:] for k in range(len(j)+1) for j in out]

print out

对于输入'abc',它输出

Traceback (most recent call last): File "perm.py", line 6, in

out = [j[:k]+inp[i]+j[k:] for k in range(len(j)+1) for j in out] 

NameError: name 'j' is not defined

shell returned 1

如果我取消注释第 5 行,代码如下所示

inp = raw_input()

out = [inp[0]]
for i in range(1,len(inp)):
print [range(len(j)+1) for j in out]
out = [j[:k]+inp[i]+j[k:] for k in range(len(j)+1) for j in out]

print out

对于输入'abc',它输出

[[0, 1]]

[[0, 1, 2], [0, 1, 2]]

['cba', 'cab', 'bca', 'acb', 'bac','abc']

这是什么魔法?

最佳答案

你有你的列表理解循环回到前面;您需要按从左到右的嵌套顺序列出它们,因此您的 for j in out 需要

out = [j[:k]+inp[i]+j[k:] for j in out for k in range(len(j)+1)]

print 语句列表理解为您的版本定义了一个 j 名称来循环;在 Python 2 中,列表理解没有自己的作用域,因此在循环完成后可以访问 for 循环目标,就像使用常规 for 循环一样。这在 Python 3 中发生了变化,其中列表推导式现在拥有自己的范围,就像字典推导式和集合推导式以及生成器表达式一样。

如果有帮助,请先将列表理解写成常规循环;你的代码是这样做的:

tmp = []
for j in out:
tmp.append(range(len(j)+1))
print tmp

out = []
for k in range(len(j)+1):
for j in out:
out.append(j[:k]+inp[i]+j[k:])

range(len(j)+1) 表达式有效,因为您已将j用作for 前面表达式中的循环目标为 print 构建 tmp

您可能将其视为编码练习,但标准库已经包含一个生成排列的函数:itertools.permutations() :

from itertools import permutations

inp = raw_input()
print list(permutations(inp))

演示:

>>> from itertools import permutations
>>> list(permutations('abc'))
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]

关于python - 名称错误在 python 中打印时消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29386186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com