【发布时间】:2016-06-17 00:54:46
【问题描述】:
我有一个长度约为 10M 的列表。每个索引都包含一个字典
比如说……
l = [{'id': 'y'}, {'id', 'x'}, {'id', 'z'} ... ]
我有另一个列表,其中包含我要删除的项目
m = ['y', 'z']
我试过了
l = [i for i in l if i['id'] not in m]
但正如预期的那样,O(n^3) 的运行时间并不惊人。
我的第二种方法是创建一个新字典来存储我希望删除的项目的索引:
temp = {'y': 0, 'z': 2, ... }
for i in range(0, len(temp)):
del l[temp[m[-1]]]
del m[-1]
这确实将执行时间提高了很多(对于 1M 的数据集,从大约一小时到几秒或几分钟)。但是由于我将索引存储在某个地方,因此使用的内存相当高
我的问题是:有没有更有效的方法可以在 O(n) 时间从大列表中删除项目,但又不占用太多内存?
【问题讨论】:
-
你的列表排序了吗?就像你的例子一样?如果是这样,您可以使用二分搜索......这应该会提供显着的改进
-
@JoranBeasley 是的。该列表根据字典中的
time键进行排序 -
这条线真的有用吗?
l = [i for i in l if i not in m]。i是字典,m是键列表。假设字典总是有一个条目,你不想做l = [i for i in l if i.keys()[0] not in m]。第二,为什么是O(n^3)?您只需遍历列表一次。如果该元素不在m中,则保留它,否则跳过它。 -
@pushkin 啊,我的错,实际代码是正确的。我将编辑问题
-
将
m变成一个集合,而不是一个列表。集合基于字典,这使它们可以更快地查找i['id'] not in m测试,而不是检查列表中的成员资格。当您采用第二种方法时,您是如何获得要删除的项目的索引的,这不是需要很长时间吗?与 10M 的列表大小相比,大约有多少项要删除? - 1K? 1M? 990 万?
标签: python list memory time big-o