我有一个字符列表和索引列表
myList = ['a','b','c','d']
toRemove = [0,2]
我希望在一次操作中得到这个
myList = ['b','d']
我能做到这一点,但有没有办法更快地做到这一点?
toRemove.reverse()
for i in toRemove:
myList.pop(i)
答案 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_list
是numpy
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']