Python 从列表中删除大于阈值的元素

Mel*_*Mel 6 python

我想从列表中删除大于阈值的元素。

例如,一个包含元素的列表a = [1,9,2,10,3,6]

我想删除所有大于 5 的元素。

回报应该是 [1,2,3]。

我尝试使用 enumerate 和 pop 但它不起作用。

for i,x in enumerate(a):
    if x > 5:
        a.pop(i)
Run Code Online (Sandbox Code Playgroud)

Ray*_*ger 12

尝试使用列表理解

>>> a = [1,9,2,10,3,6]
>>> [x for x in a if x <= 5]
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

这表示,“创建一个新的x值列表,其中x来自a但仅当x小于或等于阈值5 时

与这个问题枚举()POP()方法是在遍历它,它发生变异的名单-有点类似于锯断树枝,而你仍然坐在肢体。所以当(i, x)is 时(1, 9)pop(i)a更改为[1,2,10,3,6],但随后迭代进行到(2, 10)意味着值2永远不会被检查。它从那里分崩离析。

FWIW,如果您需要就地可变列表,只需用切片重新分配它:

a[:] = [x for x in a if x <= 5]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :-)

  • 正如核心开发人员所期望的那样,这是一个漂亮的答案。我经常看到很多人反对向初学者展示列表推导式的想法;但我真诚地相信 - 有了适当的基础 - 它们比相应的循环“更容易”理解(对于它们合适的任务)。 (2认同)

小智 5

您还可以将该filter()函数与一个lambda函数一起使用,这对于元组而不仅仅是列表的内容可以更好地工作。


常规示例

a = [1, 9, 2, 10, 3, 6]

filtered = filter(lambda num: num > 5, a)
print(list(filtered))
Run Code Online (Sandbox Code Playgroud)

输出:[9, 10, 6]


元组示例

a = [
    ['Data1', 1],
    ['Data2', 9],
    ['Data3', 2],
]

filtered = filter(lambda num: num[1] > 5, a)
print(list(filtered))
Run Code Online (Sandbox Code Playgroud)

输出:[['Data2', 9]]