同时删除多个列表范围?

3
假设我有一个列表[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我想同时删除1到4和7到10的元素。在Python中是否可以这样做,还是只能一次删除一个范围?

考虑相反的想法:不要从现有列表中删除不需要的项目,而是尝试将所需的项目添加到新列表中。这可以通过切片来实现,正如@RafaelCardoso所暗示的那样。 - pylang
4个回答

1
据我所知,您无法使用内置的函数/库同时删除两个值。但是,您可以通过一行代码实现这一点。一种方法是使用“del”关键字删除条目,如下所示:
>>> my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#        `del` from higher range to lower range
#               v              v
>>> del my_list[6:10], my_list[0:4]
>>> my_list
[5, 6]

有趣的,其实。我不确定这算一个删除还是两个..能否使它动态化? - wim
@wim:不确定如何使其通用。试着尝试一下。 - Moinuddin Quadri
其实,这仍然是两个不同的删除操作。如果你换成 del my_list[0:4], my_list[6:10] 的顺序,结果就会不同 :( - wim
这是正确的。它按顺序执行删除。这就是为什么我提到了评论:P根据__del__的定义,它一次只接受一个对象。 - Moinuddin Quadri

1

您的示例有一种获取结果的替代方法,可以使用切片赋值来完成:

my_list[:] = my_list[5:7]

然而,通常情况下,您不能同时删除多个范围。使用Python列表,您一次只能删除一个切片。
对于numpy数组,可以使用高级索引来实现。

1
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> lst[:] = set(lst).difference(range(1, 5) + range(7, 11))
>>> lst
[5, 6]

-1
In [42]: L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

In [43]: ranges = [(1,4), (7,10)]

In [44]: for low,high in ranges[::-1]: L[low:high] = []

In [45]: L
Out[45]: [1, 5, 6, 7]

1
原问题的答案仍然缺失:如何同时删除列表中的多个范围? :) - Moinuddin Quadri
@MoinuddinQuadri:没有使用numpy是无法实现这个的。这是我只用纯python能做到的最接近的方法。 - inspectorG4dget
换句话说,一个接一个地开始,从最后一个开始。 - hpaulj
@Copperfield:inspectorG4dget 提出的答案更好,因为它更通用。 - Moinuddin Quadri
@wim:Cooperfield 提出的解决方案也需要对象按照排序顺序排列。相比之下,Gadget 的答案更好。 - Moinuddin Quadri
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接