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

时间:2015-04-01 08:32:00

标签: python list-comprehension

我试图在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']

这是什么巫术?

1 个答案:

答案 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))