Skip to main content
 首页 » 编程设计

python之将列表理解转换为 for 循环

2025年05月04日17EasonJim

假设我有这个列表和以下将列表格式化为易于阅读的格式的代码:

a = ['erin', 'david', 'chris', 'adam'] 
 
print('\n'.join('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1))))) 

输出是这样的:

4: adam 
3: chris 
2: david 
1: erin 

如果我将上面的代码转换为 for 循环,我发现为了获得与上面相同的结果,您必须删除 .join() 方法。

for 循环看起来像这样:

for i, j in reversed(list(enumerate(a,1))): 
    print ('{}: {}'.format(i,j))    

输出:

 4: adam 
 3: chris 
 2: david 
 1: erin 

对我来说,for 循环更有意义,我只是不明白为什么在列表理解中,我需要 join() 方法来获得相同的结果。

请您参考如下方法:

从技术上讲,您使用的是生成器表达式,而不是列表理解。

真正重要的问题(在我看来)是为什么首先需要 join,原因是 print 不会迭代可迭代对象作为参数传递,它只是调用 __str__ 方法来获取对象的字符串表示形式,并打印出来。对于 list,__str__ 方法生成显示其元素的列表表示,因此看起来好像 print 遍历了列表,当它实际上没有。

如果您显式写出生成器表达式:

>>> g = ('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1)))) 

然后尝试打印它,您将只看到有关该对象的信息:

>>> print(g) 
<generator object <genexpr> at 0x10fb929e8> 

如果你遍历它,你会为列表中的每个元素得到一个字符串 a:

>>> next(g) 
'4: adam' 
>>> next(g) 
'3: chris' 
>>> next(g) 
'2: david' 
>>> next(g) 
'1: erin' 

'\n'.join 字符串方法确实遍历您传递给它的参数,并将每个结果连接成一个字符串:

>>> g = ('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1)))) 
>>> '\n'.join(g) 
'4: adam\n3: chris\n2: david\n1: erin' 

当您使用 for 循环时,您还会迭代生成器表达式的结果,并打印每个结果。