我试图在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',输出
回溯(最近一次呼叫最后):文件" perm.py",第6行,
out = [j[:k]+inp[i]+j[k:] for k in range(len(j)+1) for j in out]
NameError:name' j'未定义
shell返回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',& #39; ABC']
这是什么巫术?
答案 0 :(得分:3)
你的列表理解循环回到前面;您需要按照从左到右的嵌套顺序列出它们,因此您的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中已经发生了变化,其中列表推导现在有了自己的范围,就像dict和set comprehensions以及生成器表达式一样。
如果有帮助,请先将列表推导写成常规循环;你的代码做到了这一点:
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
作为tmp
循环目标{ {1}}。
您可能将此视为编码练习,但标准库已包含一个产生排列的函数:itertools.permutations()
:
print
演示:
from itertools import permutations
inp = raw_input()
print list(permutations(inp))