Найти подходящие пары словарей в списке, используя Python - PullRequest
3 голосов
/ 10 июля 2019

В данном списке:

unmatched_items_array = [{'c': 45}, {'c': 35}, {'d': 5}, {'a': 3.2}, {'a': 3}]

Найдите все пары ключей и распечатайте, и, если не найдено пар для данного словаря, распечатайте этот словарь.

Что мне удалось написатьпока что вроде работает, но он продолжает тестировать некоторые пункты списка, даже если они уже были протестированы.Не уверен, как это исправить.

for i in range(len(unmatched_items_array)):
        for j in range(i + 1, len(unmatched_items_array)):
            #  when keys are the same print matching dictionary pairs
            if unmatched_items_array[i].keys() == unmatched_items_array[j].keys():
                print(unmatched_items_array[i], unmatched_items_array[j])
                break
        #  when no matching pairs print currently processed dictionary
        print(unmatched_items_array[i])

Вывод:

{'c': 45} {'c': 35}
{'c': 45}
{'c': 35}
{'d': 5}
{'a': 3.2} {'a': 3}
{'a': 3.2}
{'a': 3}

Какой вывод должен быть:

{'c': 45} {'c': 35}
{'d': 5}
{'a': 3.2} {'a': 3}

Что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Использование collections.defaultdict

Пример:

from collections import defaultdict

unmatched_items_array = [{'c': 45}, {'c': 35}, {'d': 5}, {'a': 3.2}, {'a': 3}]
result = defaultdict(list)

for i in unmatched_items_array:
    key, _ = i.items()[0]
    result[key].append(i)          #Group by key. 

for _, v in result.items():        #print Result. 
    print(v)

Выход:

[{'a': 3.2}, {'a': 3}]
[{'c': 45}, {'c': 35}]
[{'d': 5}]
1 голос
/ 10 июля 2019

С itertools.groupby:

from itertools import groupby

unmatched_items_array = [{'d': 5}, {'c': 35}, {'a': 3}, {'a': 3.2}, {'c': 45}]

for v, g in groupby(sorted(unmatched_items_array, key=lambda k: tuple(k.keys())), lambda k: tuple(k.keys())):
    print([*g])

Печать:

[{'a': 3}, {'a': 3.2}]
[{'c': 35}, {'c': 45}]
[{'d': 5}]

РЕДАКТИРОВАТЬ: Если ваши элементы в списке уже отсортированы по ключам, то вы можете пропустить sorted() вызов:

for v, g in groupby(unmatched_items_array, lambda k: tuple(k.keys()) ):
    print([*g])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...