Python 将列表理解转换为for循环
假设我有这个列表和下面的代码,它们将列表格式化为一种可读的格式:Python 将列表理解转换为for循环,python,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循环
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()方法来获得相同的结果。您的列表理解更接近于此:
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))
或:
您对列表的理解更接近于此:
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))
或:
联接只是在联接的元素之间加上一个换行符
\n
,然后打印就写入了一个长字符串
"4: adam\n3: chris\n2: david\n1: erin"
在第二种方法中,
print
语句正在处理添加换行符的操作。连接只是在连接的元素之间放置一个换行符\n
,然后打印正在写入一个长字符串
"4: adam\n3: chris\n2: david\n1: erin"
在第二种方法中,
print
语句正在处理添加换行符的操作。当您希望使用迭代器创建输出列表时,通常使用列表理解。当您想使用迭代器执行某些操作时,或者有时当逻辑有点太复杂而无法填充到列表中时,可以使用For循环
在您的例子中,需要join函数的原因是因为在for循环中,您要为每个字符串调用print一次。print每次打印字符串时都会添加一个换行符。通过列表理解,您可以构建要打印的整个字符串,然后调用print一次。因为只调用print一次,所以您需要自己添加换行符,这就是join所做的。当您想要使用迭代器创建输出列表时,通常使用列表理解。当您想使用迭代器执行某些操作时,或者有时当逻辑有点太复杂而无法填充到列表中时,可以使用For循环
在您的例子中,需要join函数的原因是因为在for循环中,您要为每个字符串调用print一次。print每次打印字符串时都会添加一个换行符。通过列表理解,您可以构建要打印的整个字符串,然后调用print一次。由于只调用print一次,您需要自己添加换行符,这就是join所做的。如果没有
join
则只有生成器表达式:
>>> ('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1))))
<generator object <genexpr> at 0xb72736e4>
但这还不是必需的输出
您可以使用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
无论如何,您使用旧式
for
循环的“反例”在这种特定情况下可能更合适,具体取决于周围的代码。没有连接
您只有生成器表达式:
>>> ('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1))))
<generator object <genexpr> at 0xb72736e4>
但这还不是必需的输出
您可以使用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
无论如何,您使用旧式
for
循环的“反例”在这种特定情况下可能更合适,具体取决于周围的代码。从技术上讲,您使用的是生成器表达式,而不是列表理解
(在我看来)真正重要的问题是,为什么首先需要一个join
,原因是print
没有迭代作为参数传递的iterable,它只调用\uuu str\uuu
方法来获取对象的字符串表示,然后打印它。对于列表
,\uuuuu str\uuuuu
方法生成列表的表示形式,显示其元素,因此看起来好像是打印
在列表上迭代,而实际上没有
如果显式写出生成器表达式:
>>> g = ('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1))))
然后尝试打印,您将只看到有关对象的信息:
>>> print(g)
<generator object <genexpr> at 0x10fb929e8>
“\n”.join
string方法会迭代传递给它的参数,并将每个结果连接成一个字符串:
>>> 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循环时,您还可以迭代生成器表达式的结果,并打印每个结果。从技术上讲,您使用的是生成器表达式,而不是列表 (在我看来)真正重要的问题是,为什么首先需要一个
join
,原因是print
没有迭代作为参数传递的iterable,它只调用\uuu str\uuu
方法来获取对象的字符串表示,然后打印它。对于列表
,\uuuuu str\uuuuu
方法生成列表的表示形式,该表示形式显示其元素,因此看起来就像打印
i