Словарь в словаре с дублирующимися ключами Python

Рейтинг: 0Ответов: 1Опубликовано: 12.08.2023

У меня есть перечень (ниже), где первое значение это город отправления, второе - город прибытия, третье - расстояние между городами.

city_A;city_B;148
city_B;city_A;148
city_A;city_C;178
city_C;city_A;178
city_F;city_A;162
city_A;city_F;162
city_F;city_C;168
city_C;city_F;170
city_F;city_E;141
city_E;city_F;141
city_B;city_D;169
city_D;city_B;169
city_A;city_G;2141
city_G;city_A;242
city_E;city_G;191
city_G;city_E;191
city_G;city_E;320
city_E;city_G;320
city_B;city_G;282
city_G;city_B;283
city_E;city_B;339
city_B;city_E;339
city_K;city_B;147
city_B;city_K;147
city_C;city_H;224
city_H;city_C;224
city_D;city_H;148
city_H;city_D;148
city_J;city_K;137
city_K;city_J;137
city_H;city_J;234
city_J;city_H;234
city_K;city_E;288
city_E;city_K;288

Я хотел сохранить эти данные как словарь в словаре предварительно сохранив данные в текстовый файл

odict = {}

for line in data_file:
    line = line.rstrip()
    line_list = line.split(";")
    
    odict.update({line_list[0], {line_list[1]: line_list[2]}})
    
return odict

но проблема в том что у меня есть дубликаты ключей чего делать нельзя и я так и не понял можно ли это сделать вообще используя словари или вообще нужно переделать в структуру как список в списке или все-таки словарь а внутри него список. Далее используя полученную структуру мне нужно вывести на печать в таком виде:

city_A    city_B   100
city_A    city_C   200
city_A    city_E   300
city_B    city_A   100
city_C    city_A   200
... и т.д

то-есть на печать город отправления в алфавитном порядке, и если у города отправления есть несколько городов прибытия, то города прибытия так же выводятся в алфавитном порядке.

Заранее спасибо

Ответы

▲ 2Принят

Делаем словарь, где ключи - отсортированные кортежи с названиями городов. Поэтому при формировании словаря будут отсечены дубликаты. Далее сортируем ключи словаря и выводим итог в нужном формате. Для данного примера вместо файла используется поток в памяти io.StringIO.

import io

text = """city_A;city_B;148
city_B;city_A;148
city_A;city_C;178
city_C;city_A;178
city_F;city_A;162
city_A;city_F;162
city_F;city_C;168
city_C;city_F;170
city_F;city_E;141
city_E;city_F;141
city_B;city_D;169
city_D;city_B;169
city_A;city_G;2141
city_G;city_A;242
city_E;city_G;191
city_G;city_E;191
city_G;city_E;320
city_E;city_G;320
city_B;city_G;282
city_G;city_B;283
city_E;city_B;339
city_B;city_E;339
city_K;city_B;147
city_B;city_K;147
city_C;city_H;224
city_H;city_C;224
city_D;city_H;148
city_H;city_D;148
city_J;city_K;137
city_K;city_J;137
city_H;city_J;234
city_J;city_H;234
city_K;city_E;288
city_E;city_K;288"""

out = {}
with io.StringIO(text) as data_file:
    for line in data_file:
        *ab, d = line.rstrip().split(';')
        out[tuple(sorted(ab))] = int(d)
for key in sorted(out.keys()):
    print(f'{key[0]} {key[1]} {out[key]}')

Вывод:

city_A city_B 148
city_A city_C 178
city_A city_F 162
city_A city_G 242
city_B city_D 169
city_B city_E 339
city_B city_G 283
city_B city_K 147
city_C city_F 170
city_C city_H 224
city_D city_H 148
city_E city_F 141
city_E city_G 320
city_E city_K 288
city_H city_J 234
city_J city_K 137