Проблемы со слиянием одинаковых значений для разных ключей в словаре - PullRequest
0 голосов
/ 27 марта 2019

У меня есть много координат, для которых я создал большой словарь, для которого отдельные ключи могут иметь одинаковый список значений.Я хочу объединить эти ключи с одним и тем же списком значений, чтобы подсчитать, сколько ключей имеют данный список значений.Мне удалось объединить их, но по какой-то причине некоторые значения поменялись местами и поэтому не были правильно объединены.

До сих пор я пытался создать новый словарь с объединенными ключами в качестве кортежа и сохранилзначения в виде списка.Кроме того, я сохраняю только тот список значений, в котором есть два или более ключей.

Мой стартовый словарь

start_dict = {
    'Key1': [243928620, 243938319],
    'Key2': [243935130, 243935973],
    'Key3': [243928620, 243938319],
    'Key4': [243928628, 243938315],
    'Key5': [243928628, 243938315],
    'Key6': [243930418, 243933130, 243933141]
}

Для которых Ключи 1 и 3 имеют одинаковый список значений, одинаковый для Key4 & 5Таким образом, я объединил их, используя

from collections import defaultdict
New_dict= defaultdict(list)
for k, v in sorted(start_dict.items()):
    New_dict[tuple(v)].append(k)

final_dict = {tuple(v):set(k) for k, v in New_dict.items()}

с ожидаемыми результатами, равными

{(‘Key1’,’Key2’): {243928620, 243938319}, (‘Key4’,’Key5’): {243928628, 243938315}}

Но по некоторым причинам это заканчивается как

{(‘Key1’,’Key2’): {243928620, 243938319}, (‘Key4’,’Key5’): {243938315,243928628}}

Гдепереключаются значения в одном списке, что является проблемой, поскольку порядок координат имеет значение.

Конечно, фактический набор данных больше, и объединение работает для 49/50 ключей и списка пар значений.

Спасибо за ваше время и предложения.

1 Ответ

3 голосов
/ 27 марта 2019

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

new_dict = defaultdict(list)
for k, v in sorted(start_dict.items()):
    new_dict[tuple(v)].append(k)

final_dict = { tuple(v): list(k) for k, v in new_dict.items() if len(v) > 1 }

Нет необходимости использовать set поскольку нас не волнует уникальность значений в самих списках.

Вывод:

{('Key1', 'Key3'): [243928620, 243938319], ('Key4', 'Key5'): [243928628, 243938315]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...