根据条件删除列表元素

Posted

技术标签:

【中文标题】根据条件删除列表元素【英文标题】:Deleting list elements based on condition 【发布时间】:2011-11-29 05:42:34 【问题描述】:

我有一个列表列表:[word, good freq, bad freq, change_status]

list_1 = [['good',100, 20, 0.2],['bad', 10, 0, 0.0],['change', 1, 2, 2]]

我想从列表中删除所有不满足条件的元素。

所以如果change_status > 0.3 and bad_freq < 5那么我想删除它对应的那个元素。

所以 list_1 将被修改为,

list_1 = [['good',100, 20, 0.2],['bad', 10, 0, 0.0]]

我如何选择性地做到这一点?

【问题讨论】:

我认为他的意思是> 是第一个。但实际上你的评论是错误的。 x < ax < ba < b 结果为 x < a,而不是 x < b,如您所说。 我得到 goodchange 而不是 goodbad 在这些条件下——bads bad_freq0 并且它的 change_status 是 @98765433 . 【参考方案1】:
list_1 = [['good',100, 20, 0.2],['bad', 10, 0, 0.0],['change', 1, 2, 2]]
list_1 = [item for item in list_1 if item[2] >= 5 or item[3] >= 0.3]

如果需要,您也可以使用if not (item[2] < 5 and item[3] < 0.3) 作为条件。

【讨论】:

比带有lambdafilter 更像pythonic。 @savinos 查看我对 ThiefMaster 的回答。列表推导通常被认为更符合 Python 风格,尤其是mapfilter 需要 lambda 而不仅仅是内置时。【参考方案2】:

filter 函数与适当的函数一起使用。

list_1 = filter(lambda x: x[3] <= 0.3 and x[2] < 5, list_1)

演示:

In [1]: list_1 = [['good',100, 20, 0.2],['bad', 10, 0, 0.0],['change', 1, 2, 2]]
In [2]: filter(lambda x: x[3] <= 0.3 and x[2] < 5, list_1)
Out[2]: [['bad', 10, 0, 0.0]]

请注意 good 不满足您的条件(20 &lt; 5 为假),即使您在问题中这么说!


如果您有很多元素,您可能希望使用 itertools 中的等效函数:

from itertools import ifilter
filtered = ifilter(lambda x: x[3] <= 0.3 and x[2] < 5, list_1)

【讨论】:

他编辑的问题与那个不等式不匹配,只对内置函数使用过滤器,否则使用列表理解。 “并且只对内置函数使用过滤器” - 有什么原因吗? 因为列表推导比在 lambda 上的过滤器更好读,而且通常也表现更好。 lambda 的开销相当高。如果性能很重要,并且有适当的内置函数(通常来自 operator 模块),那么对内置函数进行过滤有时会比等效的列表理解更快。 他要移除满足这些条件的元素,你需要反转它们(我犯了同样的错误)。

以上是关于根据条件删除列表元素的主要内容,如果未能解决你的问题,请参考以下文章

list列表和tuple条件判断循环dict和set调用函数定义函数

Python 中如何删除一个列表 List 中多个符合条件的元素

Python 中如何删除一个列表 List 中多个符合条件的元素

使用条件删除列表中的元素

我的javascript代码有啥问题-根据条件(存在另一个元素)删除HTML元素-初学者

有条件地从 Java 8 中的列表中删除元素 [重复]