删除从列表中的元素简洁的方式我有一组字符和索引通过指数在Python
myList = ['a','b','c','d']
toRemove = [0,2]
,我想在一个操作
myList = ['b','d']
我得到这个名单可以做到这一点,但有没有办法做得更快?
toRemove.reverse()
for i in toRemove:
myList.pop(i)
删除从列表中的元素简洁的方式我有一组字符和索引通过指数在Python
myList = ['a','b','c','d']
toRemove = [0,2]
,我想在一个操作
myList = ['b','d']
我得到这个名单可以做到这一点,但有没有办法做得更快?
toRemove.reverse()
for i in toRemove:
myList.pop(i)
如果你愿意,你可以使用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
。
难道你不觉得Numpy对于简单的“删除阵列”问题有点矫枉过正吗? –
也许OP已经在使用'numpy',并且所讨论的列表有数百万个元素?如果是这可能是最快的答案。 –
@SuperDisk,我觉得'numpy'的方式非常方便,而且可能很有用。当然这个任务很容易,没有'numpy',但'numpy'选项值得一提。 – Akavall
的回答言简意赅
>>> myList = ['a','b','c','d']
>>> toRemove = [0,2]
>>>
>>> [v for i, v in enumerate(myList) if i not in toRemove]
['b', 'd']
>>>
使'toRemove'成为一套,这实际上是一个非常好的算法。它是'O(m)'而不是'O(n * m)',其中'n = len(toRemove); m = len(myList)',因为它每次删除一个项目时都不会重复复制数组的一半。 – delnan
使'setRemove'成为'set'可能是一个好主意,但取决于'toRemove'和'myList'的时间长度是否会有所改进。我并没有写这本书,因为我想简明扼要! –
一行代码:
>>>[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)
MYLIST现在是[ 'C', 'd']
此实现与OP的不同(假设规格正确)。 – delnan
你可以使用一个列表理解其他答案建议,但要使它真正更快我建议使用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)。请记住,除非移除真的很大(例如超过一千),否则速度的差异将不会被注意到。
您提供的示例实现不正确,或者您的规范是。该算法删除索引为0的项目,然后删除由于删除而移动到索引2的项目(即“d'”)。 – delnan
我使用了'toRemove.reverse',因此要删除的第一个元素位于索引2上,然后删除索引0上的元素。只有当'toRemove'列表已排序时,这才起作用。 – Youcha