Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列表理解转换为for循环_Python - Fatal编程技术网

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