我有一个字符列表和一个索引列表
myList = ['a','b','c','d']
toRemove = [0,2]
我希望能以一次操作完成此事,与IT技术有关。
myList = ['b','d']
我能做这个,但有没有更快的方法?
toRemove.reverse()
for i in toRemove:
myList.pop(i)
我有一个字符列表和一个索引列表
myList = ['a','b','c','d']
toRemove = [0,2]
我希望能以一次操作完成此事,与IT技术有关。
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']
>>>
toRemove
变成一个集合,这实际上是一个非常好的算法。它的时间复杂度为O(m)
,而不是O(n * m)
,其中n = len(toRemove); m = len(myList)
,因为它在每次删除一个项目时不会重复复制数组的一半。 - user395760toRemove
设置为set
可能是个好主意,但这取决于toRemove
和myList
的长度是否会有所改善。我最初没有写那个,因为我想要简洁! - Nick Craig-Woodset
来存储您想要删除的索引集合。>>> myList = ['a','b','c','d']
>>> toRemove = set([0,2])
>>> [x for i,x in enumerate(myList) if i not in toRemove]
['b', 'd']
将myList中的每个元素与toRemove中的每个元素进行比较是O(n*m)(其中n是myList的长度,m是toRemove的长度)。如果使用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
。numpy
,而且所涉及的列表有数百万个元素?如果是这样,那么这可能是最快的答案。 - Nick Craig-Woodnumpy
的方式非常方便,也很有用。当然,如果没有numpy
,这个任务也很容易完成,但是提到numpy
选项还是值得一提的。 - Akavall一行代码:
>>>[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']
toRemove.reverse
,这样第一个要删除的元素就在索引2上,然后我再删除索引0上的元素。这只有在toRemove
列表已排序时才有效。 - Youcha