Дедупликация элементов словаря на основе условий [Python] - PullRequest
2 голосов
/ 17 апреля 2020

У меня есть следующий словарь:

dict = {
'key-1': [('blue', '-20'), ('red', '-67')], 
'key-2': [('blue', '-77'), ('cyan', '-67'), ('white', '-57')],
'key-3': [('blue', '-39'), ('cyan , '-35'), ('purple', '-60')]
}

Приведенный выше словарь содержит ключи с кортежами («color», «weights»). Я хочу отфильтровать список таким образом, чтобы в случае дублирования цвета в словаре кортеж с наибольшим весом сохранялся, а все остальные вхождения этого цвета выводились из словаря.

В этом случае отфильтрованный словарь должен выглядеть следующим образом:

filtered_dict = {
'key-1': [('blue', '-20'), ('red', '-67')], 
'key-2': [('white', '-57')],
'key-3': [('purple', '-60'), ('cyan', '-35')]
}

Словарь создается динамически с цветами и весами. Как мне подойти к этой проблеме?

При необходимости структура, в которой формируется словарь, может быть изменена.

[Редактировать: Весами являются отрицательные числа]

Ответы [ 2 ]

4 голосов
/ 17 апреля 2020

Создать max_dict, который содержит все пары ключ-значение color-max. Затем переберите исходный словарь, сравнив каждый кортеж с max_dict.

key_dict = {
'key-1': [('blue', '20'), ('red', '67')], 
'key-2': [('blue', '77'), ('cyan', '67'), ('white', '57')],
'key-3': [('blue', '39'), ('cyan' , '35'), ('purple', '60')]
}

# create a max_dict including all the key-value pairs of color-maximum value
max_dict = dict()

for color_list in key_dict.values():
    for item in color_list:
        if item[0] not in max_dict.keys():
            max_dict.update({item[0]: int(item[1])})
        else:
            if int(item[1]) > max_dict[item[0]]:
                max_dict.update({item[0]: int(item[1])})

# create a list to hold all the updated list of tuples from the original dictionary
list_of_values = []

# sort through the original dictionary, comparing each tuple to the max_dict key-value pairs
for color_list in key_dict.values():
    list_of_tuples = []
    for item in color_list:
        if int(item[1]) == max_dict[item[0]]:
            list_of_tuples.append(item)
    list_of_values.append(list_of_tuples)

filtered_dict = dict(zip(key_dict.keys(), list_of_values))

Вывод:

>>> filtered_dict
{'key-1': [('red', '67')], 'key-2': [('blue', '77'), ('cyan', '67'), ('white', '57')], 'key-3': [('purple', '60')]}
1 голос
/ 17 апреля 2020

Вы можете создать словарь со всеми максимальными весами для каждого цвета, используя collections.defaultdict:

from collections import defaultdict

dic = {
    'key-1': [('blue', '-20'), ('red', '-67')], 
    'key-2': [('blue', '-77'), ('cyan', '-67'), ('white', '-57')],
    'key-3': [('blue', '-39'), ('cyan' , '-35'), ('purple', '-60')]
}

color_weight_groups = defaultdict(list)

for lst in dic.values():
    for color, weight in lst:
        color_weight_groups[color].append(weight)

max_weights = {k: max(map(int, v)) for k, v in color_weight_groups.items()}

print(max_weights)

, который будет выглядеть следующим образом:

{'blue': -20, 'red': -67, 'cyan': -35, 'white': -57, 'purple': -60}

Затем создайте новый словарь, который сравнивает каждый вес с максимальным весом:

result = {
    k: [(color, weight) for color, weight in v if int(weight) == max_weights[color]]
    for k, v in dic.items()
}

print(result)

, который дает этот отфильтрованный результат:

{'key-1': [('blue', '-20'), ('red', '-67')], 'key-2': [('white', '-57')], 'key-3': [('cyan', '-35'), ('purple', '-60')]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...