![]() |
1
490
奇怪的是,对于不同的人来说,美的差异有多大。我发现清单的理解比
有两件事可能会减慢你使用
第一个是函数调用开销:只要使用python函数(无论
另一个可能应用的开销是lambda被强制访问一个作用域变量(
另一个要考虑的选择是使用生成器而不是列表理解:
然后,在您的主代码(可读性真正重要的地方)中,您已经用一个希望有意义的函数名替换了列表理解和过滤器。 |
![]() |
2
204
这在巨蟒身上是一个宗教问题。尽管
Guido considered removing
就我个人而言,我觉得列表理解更容易阅读。从表达式中可以更清楚地看到正在发生的事情
我不会太担心这两种方法之间的性能差异,因为它是边际的。如果它被证明是您的应用程序中的瓶颈(这不太可能),那么我真的只会对此进行优化。
也因为
BDFL
需要的
|
![]() |
3
61
因为任何速度差都是很小的,所以不管是使用过滤器还是列表理解,归根结底都取决于品味。一般来说,我倾向于使用理解(这似乎与这里的大多数其他答案一致),但有一种情况我更喜欢
一个非常常见的用例是根据谓词p(x)提取一些iterable x的值:
但有时您希望首先对值应用一些函数:
我觉得这个比用这个稍微好一点
在这种情况下,我们想
|
![]() |
4
28
虽然
|
![]() |
5
15
我想在python 3中,filter()实际上是一个迭代器对象,所以您必须将filter方法调用传递到list()才能构建筛选列表。所以在Python 2中:
列表b和c具有相同的值,并且在与filter()等效的时间内完成(x代表x,y代表x,if z)。但是,在3中,相同的代码将使列表C包含一个筛选对象,而不是一个筛选列表。要在3中生成相同的值:
问题是list()将iterable作为其参数,并从该参数创建一个新的列表。结果是,在python 3中以这种方式使用filter,花费的时间比y if z中x的[x for x]方法长两倍,因为您必须迭代filter()的输出和原始列表。 |
![]() |
6
10
一个重要的区别是列表理解将返回
我自己的自学使我遇到了类似的问题。
也就是说,如果有办法
编辑:这是Python3的情况,而不是2(参见注释中的讨论)。 |
![]() |
7
9
我发现第二种方式更具可读性。它确切地告诉你目的是什么:过滤列表。
|
![]() |
8
7
Filter 就是这样。它过滤掉列表中的元素。您可以看到定义提到相同的内容(在我前面提到的官方文档链接中)。然而,列表理解是在执行之后产生一个新列表的东西 某物 在上一个列表中。(筛选和列表理解都会创建新列表,而不会代替旧列表执行操作。这里的一个新列表类似于一个具有全新数据类型的列表。例如将整数转换为字符串等) 在您的示例中,根据定义,使用过滤比列表理解更好。但是,如果您愿意,比如说列表元素中的其他_属性,在您的示例中是作为一个新列表来检索的,那么您可以使用列表理解。
这就是我对过滤和列表理解的实际记忆。删除列表中的一些内容并保持其他元素的完整性,使用filter。在元素中单独使用一些逻辑,并创建一个适合某些目的的减淡列表,使用列表理解。 |
![]() |
9
6
通常地
在你的情况下,我希望单子理解得稍微快一点 |
![]() |
10
5
这是我用来过滤东西的短篇 之后 列表理解。只是过滤器、lambda和列表的组合(也称为猫的忠诚度和狗的清洁度)。 在本例中,我正在读取一个文件,去掉空白行、注释行以及行上注释后的任何内容:
|
![]() |
11
4
除了接受的答案之外,还有一个角落案例,当您应该使用过滤器而不是列表理解时。如果列表不可显示,则不能直接用列表理解来处理它。一个现实世界的例子是如果你使用
如果在这里使用列表理解,则会得到错误:
|
![]() |
12
3
我花了一些时间熟悉
然后我读了这段话(流利的python书):
现在我想,为什么还要考虑
最后,为了测试它,我对两种方法都进行了计时(
|
![]() |
13
0
奇怪的是,在python 3上,我看到过滤器比列表理解执行得更快。 我一直认为清单的理解会更有效。 类似: [品牌中名称的名称\如果名称不是“无”,则为“数据库”] 生成的字节码要好一点。
但实际上速度较慢:
|
![]() |
14
-5
我的拿来
|
![]() |
Sergei · 删除数据框中多个列的列表中的某些元素 2 年前 |