我试图用 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/