根据条件删除列表元素

Zen*_*ega 30 python list elements

我有一份清单清单: [word, good freq, bad freq, change_status]

list_1 = [['good',100, 20, 0.2],['bad', 10, 0, 0.0],['change', 1, 2, 2]]
Run Code Online (Sandbox Code Playgroud)

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

所以,如果change_status > 0.3 and bad_freq < 5那时我想删除与之对应的元素.

所以list_1会被修改为,

list_1 = [['good',100, 20, 0.2],['bad', 10, 0, 0.0]]
Run Code Online (Sandbox Code Playgroud)

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

agf*_*agf 38

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]
Run Code Online (Sandbox Code Playgroud)

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

  • @savinos看看我对ThiefMaster答案的评论.列表推导通常被认为是Pythonic,_esmantic_当`map`或`filter`需要`lambda`而不仅仅是内置. (3认同)
  • 比带有“lambda”的“filter”更具Python风格。 (2认同)
  • 是正确的,但也许“过滤器”更优雅一些 (2认同)

Thi*_*ter 11

使用filter具有适当功能的功能.

list_1 = filter(lambda x: x[3] <= 0.3 and x[2] < 5, list_1)
Run Code Online (Sandbox Code Playgroud)

演示:

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]]
Run Code Online (Sandbox Code Playgroud)

请注意,即使你在问题中这么说,也不能满足你的条件(20 < 5是假的)!


如果你有许多元素,你可能想要使用itertools中的等效函数:

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

  • `itertools.ifilter()` 在 *Python 3* 中被删除,因为内置的 `filter()` 函数现在提供相同的功能。 (2认同)