как удалить дубликаты списков из словаря с сохранением ключ значение

Рейтинг: -1Ответов: 2Опубликовано: 12.08.2023
user_list2 = {46: [50, 43], 47: [50, 46], 49: [50, 43], 48: [43, 50]}
data = {tuple(item) for item in map(sorted, user_list2.values())} 
print(data)
result : {(43, 50), (46, 50)}

у меня сортировка получается но без сохранения ключей для каждого списка в словаре

Ответы

▲ 1

Ну, например, так:

data = {v: k for k, v in 
    {tuple(sorted(v)): k for k, v in 
        reversed(user_list2.items())}.items()}

Вывод:

{46: (43, 50), 47: (46, 50)}

Суть: меняем местами элементы в парах ключ-значение и заполняем ими новый словарь, причём перебираем пары в обратном порядке, чтобы более ранние ключи затирали более поздние (в словаре ключи не могут повторяться), после этого опять меняем элементы местами в парах ключ-значение.

Если наоборот нужно, чтобы остались более поздние ключи, то reversed нужно убрать.

▲ 1

Ну а если нужно сохранить и порядок следования элементов внутри списков, то можно так:

user_list2 = {46: [50, 43], 47: [50, 46], 49: [50, 43], 48: [43, 50]}
dub, out = set(), {} # множество для отсеивания дубликатов и пустой словарь для результата
for k, v in user_list2.items():
    s = tuple(sorted(v))
    if s not in dub: # если список встретился впервые, то 
        out[k] = v   # заносим в словарь исходный несортированный список
        dub.add(s)   # и заносим в множество отсортированный кортеж, полученный из списка

print(out)
{46: [50, 43], 47: [50, 46]}