从Python列表中删除包含重复字段的非重复字典

时间:2018-10-06 20:46:02

标签: python list

我从数据库中获得了超过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)

但是,列表中成千上万个项目花费的时间相当长。有更有效的方法吗?

1 个答案:

答案 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}]