5

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

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

我想在一次手术中得到这个

myList = ['b','d']

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

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

5 回答 5

5

简洁的答案

>>> myList = ['a','b','c','d']
>>> toRemove = [0,2]
>>> 
>>> [v for i, v in enumerate(myList) if i not in toRemove]
['b', 'd']
>>> 
于 2012-06-07T22:09:57.390 回答
5

您可以像其他答案所建议的那样使用列表理解,但为了使其真正更快,我建议您使用 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 非常大(比如超过一千个),否则速度上的差异不会很明显。

于 2012-06-07T22:16:13.677 回答
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.

于 2012-06-07T22:29:17.877 回答
1

单线:

>>>[myList[x] for x in range(len(myList)) if not x in [0,2]]
['b', 'd']
于 2012-06-07T22:10:56.147 回答
0

你可以编写一个函数来为你做这件事。

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

然后做

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

我的列表现在是 ['c', 'd']

于 2012-06-07T22:15:10.840 回答