Как перечислить повторяющиеся значения в словаре, который представляет рейсы? - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть словарь, в котором есть еще один словарь, и несколько списков внутри него.

flightsD={"Delta":{1102:[["IND",1850],["MDW",1955]],
               1096:[["PHX",900],["MDW",1255]],
               1445:[["ATL",1135],["LAX",1810]],
               1776:[["PHL",1350],["RAP",1610]],
               1226:[["PHX",950],["MDW",1345]],
               1885:[["ATL",1305],["LAX",2000]],
               1009:[["MDW",1850],["IND",1955]],
               9001:[["MDW",2145],["IND",2255]]},
      "Southwestern":{1111:[["SAT",430],["MDW",825]],
                      2121:[["MDW",430],["SAT",825]],
                      4335:[["PHX",450],["MDW",745]],
                      1102:[["MDW",1100],["PHX",1450]]},
      "American":{7765:[["IND",1850],["CHA",2105]],
               2133:[["BNA",900],["IND",1115]],
               3321:[["HOU",1335],["ATL",1615]],
               2100:[["BNA",900],["IND",1115]],
               4311:[["HOU",905],["ATL",1255]],
               5577:[["ATL",1100],["HOU",1350]],
               1102:[["BNA",1100],["HOU",1450]]}  }

Как видите, у Delta, Southwestern и American есть рейсы 1102. Я хотел бы перечислить все дублирующиеся рейсыкак список внутри словаря.Ожидаемый результат:

{1102: ['American', 'Southwestern', 'Delta']}

Я пытался получить доступ к этим значениям, перебирая словарь так:

for airline in flightsD:
    for flights in flightsD[airline]:

Я думаю о создании списка для хранения всех этих значений, ноЯ не совсем уверен, как это сделать

Ответы [ 3 ]

0 голосов
/ 17 ноября 2018

Если вам нужен словарь с просто этими значениями, вы можете использовать код ниже (на основе кода выше):

list = []
for flights in flightsD.values():
    list.extend(flights.keys())

d = {}
for airline, flights in flightsD.items():
    for flight in flights:
        if list.count(flight) > 1:
            d.setdefault(flight, []).append(airline)
0 голосов
/ 17 ноября 2018

Вы можете использовать defaultdict следующим образом:

from collections import defaultdict

airlines, schedules = flightsD.keys(), flightsD.values()

flight_nums = [s.keys() for s in schedules]

duplicates = defaultdict(list)
for i, item1 in enumerate(flight_nums):
    for j, item2 in enumerate(flight_nums):       
        for k in item1:
            if i != j and k in item2 and airlines[i] not in duplicates[k]:
                duplicates[k].append(airlines[i])


print(duplicates)

>>> {1102: ['American', 'Southwestern', 'Delta']}
0 голосов
/ 17 ноября 2018

Вы можете перебирать элементы dict, использовать dict.setdefault для инициализации выходного dict списком, к которому добавляются авиалинии, и использовать понимание dict для вывода элементов с подсписками, состоящими более чем из 1 элемента:

d = {}
for airline, flights in flightsD.items():
    for flight in flights:
        d.setdefault(flight, []).append(airline)
print({k: v for k, v in d.items() if len(v) > 1})

Это выводит:

{1102: ['Delta', 'Southwestern', 'American']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...