理解Python嵌套的一行for循环

3

我正在尝试理解一行for循环,并将其转换为嵌套的普通for循环。这个一行式的for循环如下:

print ''.join((letter[i - 1]for i in (int(n) for n in key.split())))

我按照传统的方式编写了上面嵌套的for循环,如下所示:

for n in key.split():
    n = int(n)
    for i in n:
        print ''.join(letter[i - 1])

我没有得到期望的结果。请问有人能解释一下我的想法错在哪里,或者如何将上述一行式的for循环写成传统形式。谢谢。


3
这些是“列表推导式”,而不是“循环”。搜索该关键词将提供大量关于它们工作原理的阅读材料。 - user2864740
1
你正在尝试对一个整型对象 int 进行 for i in n 操作?但是 int 对象是不可迭代的。 - ashwinjv
2
那些是生成器表达式,而不是列表推导。 - cababunga
2
@第一位评论者,列表推导式和循环并不是互斥的,而且那些也不是列表推导式...正如cababunga所指出的那样,它们是生成器表达式。 - Shashank
2个回答

3
请注意您一行代码中的括号:

请仔细查看您一行代码中的括号:

print ''.join((letter[i - 1]for i in (int(n) for n in key.split())))
                                     ^---------------------------^

嵌套生成器是提供外部生成器值的序列。它可以简化为:
print ''.join((letter[int(i) - 1]for i in (n for n in key.split())))

或者仅仅是
print ''.join(letter[int(i) - 1] for i in key.split())

一个等效的循环将是

for i in key.split():
    print letter[int(i) - 1],    # Suppress the newline

谢谢@chepner。但是每次我使用你的代码打印时,每个字母后面都会有一个空格。我该如何去掉它?谢谢。 - deep
哦,那是一个好问题。我不记得在print 语句中是否有一种方法;你可以在脚本顶部添加 from __future__ import print_function ,这样就可以使用 print(letter[int(i) - 1], end=''),或者使用使用 ''.join 版本的代码,并只使用print一次。 - chepner

1

嵌套循环简化的示例。

from enum import IntEnum

class MyEnum(IntEnum):
    FOO_BAR = 0
    JOHN_DOE = 1
    
result = []
for x in MyEnum:
    x_splits = []
    for s in x.name.split('_'):
        x_splits.append( s.capitalize() )    
    result.append ( ' '.join(x_splits) )
    
# >>> result
# ['Foo Bar', 'John Doe']

第一步:
result = []
for x in MyEnum:
    x_splits = [ s.capitalize() for s in x.name.split('_') ]
    result.append ( ' '.join(x_splits) )

第二步:
result = []
for x in MyEnum:
    result.append ( ' '.join( s.capitalize() for s in x.name.split('_') ) )

第三步:
result = [ ' '.join( s.capitalize() for s in x.name.split('_') ) for x in MyEnum ]

结果相同:
# ['Foo Bar', 'John Doe']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接