将列表推导转换为for循环

时间:2015-06-29 03:11:07

标签: python

假设我有这个列表和下面的代码,它将列表格式化为一个很好的可读格式:

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()方法来获得相同的结果。

5 个答案:

答案 0 :(得分:2)

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

真正重要的问题(在我看来)是为什么你首先需要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循环时,还会迭代生成器表达式的结果,并打印每个结果。

答案 1 :(得分:1)

你的列表理解更接近于这个:

string_list = []
for i, j in reversed(list(enumerate(a,1))):
    string_list.append('{}: {}'.format(i,j))   

print('\n'.join(string_list))

我知道你已经使用了生成器表达式而不是实际的列表推导,但关键是你要创建一个字符串“列表”,然后将它们连接成一个由换行符分隔的大字符串并将其打印出来。但是在第二个示例中,您将循环遍历每个元素,创建字符串,并在每次迭代中将其打印出来(使用隐式换行符)。

为了更简单的示例,如果您想打印出名称(在列表a中),您可以通过以下两种方式执行此操作:

a = ['erin', 'david', 'chris', 'adam']
# "\n".join(a) => "erin\ndavid\nchris\nadam"
print("\n".join(a))

或:

a = ['erin', 'david', 'chris', 'adam']
for name in a:
    print(name) # prints on a new line

答案 2 :(得分:1)

联接只是在您加入的元素之间添加换行符\n,然后您的打印正在写一个长字符串

"4: adam\n3: chris\n2: david\n1: erin"

在第二种方法中,print语句正在处理添加换行符。

答案 3 :(得分:1)

当您想使用迭代器创建输出列表时,通常会使用列表推导。当你想用迭代器做某事时,或者有时当逻辑有点太复杂而不能填入列表理解时,就会使用For循环。

在您的情况下,您需要join函数的原因是因为在for循环中,您为每个字符串调用print一次。 print每次打印字符串时都会添加换行符。使用列表推导,您可以构建要打印的整个字符串,然后调用print一次。由于您只调用一次打印,因此您需要自己添加换行符,这就是连接所做的。

答案 4 :(得分:1)

如果没有join,您只有生成器表达式:

>>> ('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1))))
<generator object <genexpr> at 0xb72736e4>

您可以在列表中收集单个生成的项目:

>>> list('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1))))
['4: adam', '3: chris', '2: david', '1: erin']

但这还不是必需的输出。

您可以使用join创建单个字符串:

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

,在打印时,会提供所需的输出:

>>> print('\n'.join('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1)))))
4: adam
3: chris
2: david
1: erin

无论如何,你的&#34;反例&#34;在这种特定情况下,使用旧样式for循环可能更合适,具体取决于周围的代码。