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

标签 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',它输出

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/

相关文章:

list - Haskell 中的双重列表理解

python - if/else/if 可能在列表理解中吗?

python - 如何在 python 中使用 zip 和列表理解来展平 2D 列表并添加分隔符?

python - 在声明性 SQLAlchemy 中创建容器关系

python - 使用 py2exe 将 tkinter 编译为可执行文件,但 xlrd 存在问题

python:如何使用unicode字符串打印变量中的字符

python - 是否有与 Python 的列表理解等效的 Scala?

python - Python 列表理解中的平等

python - keras如何管理卷积层的权重?

python - 广义代码中某些列的一阶差分