Удаление неповторяющихся словарей, содержащих повторяющиеся поля, из списка в Python - PullRequest
0 голосов
/ 06 октября 2018

Я получаю список из более 100000 элементов из базы данных, некоторые из которых дублируются на основе уникального идентификатора.

Возвращенные данные аналогичны приведенным ниже:

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 голосов
/ 07 октября 2018

Вы можете использовать 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}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...