我从数据库中获得了超过100000个项目的列表,其中一些是根据唯一ID重复的。
返回的数据类似于以下内容:
my_list = [
{"id_str": "foo", "field1": "foobar", "field2":...},
{"id_str": "foo", "field2": "foobaz", "field2":...},
{"id_str": "bar", "field1": "bazfoo", "field2":...},
{"id_str": "baz", "field1": "barbaz", "field2":...},
...
]
如您所见,id_str
重复时,列表中的整个词典不一定与另一个词典重复。
我目前正在使用以下简单方法来消除具有相同id_str
值的项目:
collected_ids = []
cleaned_list = []
for item in my_list:
if(item["id_str"] not in collected_ids):
collected_ids.append(item["id_str"])
cleaned_list.append(item)
但是,列表中成千上万个项目花费的时间相当长。有更有效的方法吗?
答案 0 :(得分:0)
您可以使用 itertools.groupby ,然后为每个组只取list(g)[0]
,如果不重要则取哪个重复项
from itertools import groupby
my_list = [
{"id_str": "foo", "field1": "foobar", "field2":...},
{"id_str": "bar", "field1": "bazfoo", "field2":...},
{"id_str": "baz", "field1": "barbaz", "field2":...},
{"id_str": "foo", "field2": "foobaz", "field2":...},
]
new = []
l = sorted(my_list, key=lambda x: x['id_str'])
for k, g in groupby(l, key=lambda x: x['id_str']):
new.append(list(g)[0])
print(new)
# [{'id_str': 'bar', 'field1': 'bazfoo', 'field2': Ellipsis}, {'id_str': 'baz', 'field1': 'barbaz', 'field2': Ellipsis}, {'id_str': 'foo', 'field1': 'foobar', 'field2': Ellipsis}]