这是怎么回事;[;用Python工作?

这是怎么回事;[;用Python工作?,python,list,Python,List,请告诉我,它到底是怎么工作的?为什么每次迭代结果都写入数组 list_of_strings = [a.rstrip('\n') for a in list_of_strings] 请阅读以更好地理解Python的列表理解语法。这将获取一个字符串列表(存储在变量list\u of\u strings中),遍历它,每次将每个字符串临时分配给变量a,并从每个字符串中去除\n字符。结果是分配回同一变量的字符串列表 这是在使用。通常情况下,大多数用于循环,可以转换为等效的列表理解。下面是一个简单的例子来

请告诉我,它到底是怎么工作的?为什么每次迭代结果都写入数组

list_of_strings = [a.rstrip('\n') for a in list_of_strings]

请阅读以更好地理解Python的列表理解语法。

这将获取一个字符串列表(存储在变量
list\u of\u strings
中),遍历它,每次将每个字符串临时分配给变量
a
,并从每个字符串中去除
\n
字符。结果是分配回同一变量的字符串列表

这是在使用。通常情况下,大多数用于循环,可以转换为等效的列表理解。下面是一个简单的例子来说明这一点:

   new_list = []
   for i in range(10):
       new_list.append(i**2)
可以简单地重写为

   new_list = [i**2 for i in range(10)]
您可能会发现,获取列表理解并使用
for
-循环重写列表,以测试您的理解能力,这很有帮助(两者应产生相同的结果)


在大多数情况下,对于-循环,列表理解比等价的
更快,而且显然是一种更简洁的算法表达方式。您也可以有嵌套的列表理解(就像您可以为
-循环嵌套
),但它们很快就会变得难以理解:)

此外,虽然上面的代码中没有显示,但您可以在列表中过滤值,即,根据值是否满足某些条件,将值包括(或不包括)在结果列表中


另外,Python还提供了类似的集合理解和生成器表达式。所有这些都值得学习。

这是Python的一个特性,称为列表理解。基本上,括号中的内容是“执行此循环,然后创建结果列表”的简写

这是:

相当于此更通用的代码:

temp_list=[]
for a in list_of_strings:
   temp_list.append(a.rstrip('\n'))

list_of_strings=temp_list

在大多数情况下,列表理解更快、更容易阅读。如果您想编写非平凡的Python,请学习并使用它

每个迭代结果都不会写入列表,而是在右侧创建一个全新的列表,然后分配给=符号左侧字符串的变量列表。

列表理解具有以下通用形式

result = [ x for x in list]
此列表理解的等效程序代码为:

for x in list:
    x
for x in list:
    function(x)

创建有用的理解列表的下一步是对括号后的第一个x调用或应用函数。

result = [function(x) for x in list]
result = [x.function(arg) for x in list]

list_of_strings = [a.rstrip('\n') for a in list_of_strings]

result = [x*2 for x in list_of_numbers]
此列表理解的等效程序代码为:

for x in list:
    x
for x in list:
    function(x)


要增加列表理解的能力,可以添加如下条件:

result = [function(x) for x in list if x == True]

list_of_strings = [a.rstrip('\n') for a in list_of_strings if '\n' in a]

result = [x*2 for x in [1,2,3,4,5,6,7] if x > 3]

列表理解是很好的过滤器类函数,通常与硬c编码的原语(如cpython中的map和filter)一样快。

无需执行拼接赋值。理解的结果是,在迭代原始列表并计算整个新列表后,返回到字符串列表。好的,谢谢,但是需要生成器吗很多年前,我被告知需要拼接,但我想当时不需要。如果列表和生成器具有不同的长度,会发生什么情况?如果执行切片赋值,则使用生成器没有真正的优势,因为您当时正在生成列表,不是吗?@drewk如果在RHS上有生成器表达式,而不是列表comp,则确实需要切片赋值(否则,您将分配给generator对象,而不是将其值放入列表中)。当然,您也可以使用listcomp RHS执行此操作。它的效果确实与不使用切片的效果不同,但对listcomps来说没有任何特殊的效果-
mylist=[1,2,3]
mylist[:]=[1,2,3]
如果您以前做过类似于“另一个列表=我的列表”的操作,则始终会有不同的行为-切片会更改列表,而不是将名称重新绑定到新列表。请尝试
python-m timeit'l=range(10000);l=[x代表x在l中]”
vs
python-m timeit'l=range(10000);l[:]=(x代表x在l中)“
第一个在我的电脑上快了两倍多…:-)干杯!“您也可以有嵌套的列表理解(就像您可以有嵌套的for循环一样),但它们很快就会变得难以理解”->“列表(in)理解”?:-)@JS。。是的,有时似乎是这样:)