在Python中通过索引从列表中删除元素的简明方法

时间:2012-06-07 22:06:22

标签: python optimization

我有一个字符列表和索引列表

myList = ['a','b','c','d']
toRemove = [0,2]

我希望在一次操作中得到这个

myList = ['b','d']

我能做到这一点,但有没有办法更快地做到这一点?

toRemove.reverse()
for i in toRemove:
    myList.pop(i)

5 个答案:

答案 0 :(得分:5)

简明回答

>>> myList = ['a','b','c','d']
>>> toRemove = [0,2]
>>> 
>>> [v for i, v in enumerate(myList) if i not in toRemove]
['b', 'd']
>>> 

答案 1 :(得分:5)

您可以像其他答案所建议的那样使用列表理解,但为了使其更快,我建议您使用set作为要删除的索引集。

>>> myList = ['a','b','c','d']
>>> toRemove = set([0,2])
>>> [x for i,x in enumerate(myList) if i not in toRemove]
['b', 'd']

根据toRemove中的每个元素检查myList中的每个元素是O(n * m)(其中n是myList的长度,m是toRemove的长度)。如果使用set,则检查成员资格是O(1),因此整个过程变为O(n)。但请记住,速度的差异是不明显的,除非去除真的很大(比如超过一千)。

答案 2 :(得分:4)

如果您愿意,可以使用numpy

import numpy as np

myList = ['a','b','c','d']
toRemove = [0,2]

new_list = np.delete(myList, toRemove)

结果:

>>> new_list
array(['b', 'd'], 
      dtype='|S1')

请注意,new_listnumpy array

答案 3 :(得分:1)

一衬垫:

>>>[myList[x] for x in range(len(myList)) if not x in [0,2]]
['b', 'd']

答案 4 :(得分:0)

您可以编写一个函数来为您完成。

def removethese(list, *args):
    for arg in args:
        del list[arg]

然后做

mylist = ['a', 'b', 'c', 'd', 'e']
removethese(mylist, 0, 1, 4)

mylist现在是[' c',' d']