2012-06-07 27 views
5

删除从列表中的元素简洁的方式我有一组字符和索引通过指数在Python

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

,我想在一个操作

myList = ['b','d'] 

我得到这个名单可以做到这一点,但有没有办法做得更快?

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

您提供的示例实现不正确,或者您的规范是。该算法删除索引为0的项目,然后删除由于删除而移动到索引2的项目(即“d'”)。 – delnan

+0

我使用了'toRemove.reverse',因此要删除的第一个元素位于索引2上,然后删除索引0上的元素。只有当'toRemove'列表已排序时,这才起作用。 – Youcha

回答

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_listnumpyarray

+2

难道你不觉得Numpy对于简单的“删除阵列”问题有点矫枉过正吗? –

+1

也许OP已经在使用'numpy',并且所讨论的列表有数百万个元素?如果是这可能是最快的答案。 –

+0

@SuperDisk,我觉得'numpy'的方式非常方便,而且可能很有用。当然这个任务很容易,没有'numpy',但'numpy'选项值得一提。 – Akavall

5

的回答言简意赅

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

使'toRemove'成为一套,这实际上是一个非常好的算法。它是'O(m)'而不是'O(n * m)',其中'n = len(toRemove); m = len(myList)',因为它每次删除一个项目时都不会重复复制数组的一半。 – delnan

+0

使'setRemove'成为'set'可能是一个好主意,但取决于'toRemove'和'myList'的时间长度是否会有所改进。我并没有写这本书,因为我想简明扼要! –

1

一行代码:

>>>[myList[x] for x in range(len(myList)) if not x in [0,2]] 
['b', 'd'] 
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']

+0

此实现与OP的不同(假设规格正确)。 – delnan

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是文档,删除的长度)。如果使用set,检查成员身份是O(1),因此整个过程变为O(n)。请记住,除非移除真的很大(例如超过一千),否则速度的差异将不会被注意到。