假设我有这个列表和下面的代码,它将列表格式化为一个很好的可读格式:
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()方法来获得相同的结果。
答案 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
循环可能更合适,具体取决于周围的代码。