因此,例如,我有一个列表:
我还有一个要删除项的索引号列表:
最好的方法是什么?
myList=["asdf","ghjk","qwer","tyui"]
我还有一个要删除项的索引号列表:
removeIndexList=[1,3]
(我想从上面的列表中删除项目1和3)最好的方法是什么?
使用带有 enumerate()
的列表推导式:
newlist = [v for i, v in enumerate(oldlist) if i not in removelist]
将removelist
改为set
类型可以加快速度:
removeset = set(removelist)
newlist = [v for i, v in enumerate(oldlist) if i not in removeset]
演示:
>>> oldlist = ["asdf", "ghjk", "qwer", "tyui"]
>>> removeset = set([1, 3])
>>> [v for i, v in enumerate(oldlist) if i not in removeset]
['asdf', 'qwer']
len(removelist)
为2时,我怀疑集合并没有起到帮助作用。特别是当len(list)
只有4时。事实上:%timeit [v for i, v in enumerate(a) if i not in r]
给出了1.15微秒;%timeit [v for i, v in enumerate(a) if i not in set(r)]
则是2.39微秒,因此慢了50%。(其中仅有290纳秒是set(r)
调用的时间,其余时间是哈希和查找哈希表所需的时间比遍历一个2元素列表所需的时间更长。) - abarnertif
表达式对于每个元素都会执行,因此您在每个循环中都创建了一个新的集合。 - Martijn Pieterslist=["asdf","ghjk","qwer","tyui"]
removelist=[1,3]
for index in removelist:
del list[index]
list=["asdf","ghjk","qwer","tyui"]
removelist=[1,3]
for index in sorted(removelist, reverse=True):
del list[index]
list = [v for i, v in enumerate(list) if i not in removelist]
reversed
ن»£و›؟ن؛†sorted(...,reverse=True)
,ه¹¶ن¸”èژ·ه¾—ن؛†ه¾ˆه¤§çڑ„وˆگهٹںم€‚ - SethMMortonremovelist
保证按正向顺序排序时,这才有效。(如果你之所以知道这一点是因为你将列表明确地写成文字,那么你最好一开始就将其写成反向顺序。) - abarnertv for i
是我尚未遇到的结构,然后所有这些都被包含在一个列表中似乎很有趣,但可以理解;然后我可以理解if i not in removelist
以帮助轻松制作新列表而不包括那些元素。但我不太确定这里正在发生什么。 - Andrew
list
,那会隐藏内置类型/构造函数。 - abarnert