我有一个字符列表和索引列表
myList = ['a','b','c','d']
toRemove = [0,2]
我想在一次手术中得到这个
myList = ['b','d']
我可以做到这一点,但有没有办法更快地做到这一点?
toRemove.reverse()
for i in toRemove:
myList.pop(i)
我有一个字符列表和索引列表
myList = ['a','b','c','d']
toRemove = [0,2]
我想在一次手术中得到这个
myList = ['b','d']
我可以做到这一点,但有没有办法更快地做到这一点?
toRemove.reverse()
for i in toRemove:
myList.pop(i)
简洁的答案
>>> myList = ['a','b','c','d']
>>> toRemove = [0,2]
>>>
>>> [v for i, v in enumerate(myList) if i not in toRemove]
['b', 'd']
>>>
您可以像其他答案所建议的那样使用列表理解,但为了使其真正更快,我建议您使用 aset
作为您要删除的索引集。
>>> 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 的长度)。如果使用 a set
,则检查成员资格是 O(1),因此整个过程变为 O(n)。但请记住,除非 toRemove 非常大(比如超过一千个),否则速度上的差异不会很明显。
如果你愿意,你可以使用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
.
单线:
>>>[myList[x] for x in range(len(myList)) if not x in [0,2]]
['b', 'd']
你可以编写一个函数来为你做这件事。
def removethese(list, *args):
for arg in args:
del list[arg]
然后做
mylist = ['a', 'b', 'c', 'd', 'e']
removethese(mylist, 0, 1, 4)
我的列表现在是 ['c', 'd']