Создание списка ключей из словарей по совпадающим значениям

Есть два списка:

codes = {'AU', 'CA', 'US'}
zone_to_code = {'ACT': 'AU', 'NSW': 'AU', 'NT': 'CA', 'QLD': 'AU', 'SA': 'AU', 'TAS': 'AU', 'VIC': 'AU', 'WA': 'US', 'AB': 'CA', 'BC': 'CA', 'MB': 'CA', 'NB': 'CA', 'NL': 'CA', 'NS': 'CA', 'NU': 'CA', 'ON': 'CA'}

Как получить список вида: codes_key: [zone_to_code.keys]?

sorted = {
    'AU': ['ACT', 'NSW', 'SA'],
    'CA': ['NT', 'NL', 'NS']
  }

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


Ответы (3 шт):

Автор решения: Jack_oS
sorted = {'AU': [], 'CA': [], 'US': []}
for zone in zone_to_code.items():
    sorted[zone[1]].append(zone[0])

>>> sorted
{'AU': ['ACT', 'NSW', 'QLD', 'SA', 'TAS', 'VIC'], 'CA': ['NT', 'AB', 'BC', 'MB', 'NB', 'NL', 'NS', 'NU', 'ON'], 'US': ['WA']}
→ Ссылка
Автор решения: Zhihar

можно так:

codes = {'AU', 'CA', 'US'}
zone_to_code = {'ACT': 'AU', 'NSW': 'AU', 'NT': 'CA', 'QLD': 'AU', 'SA': 'AU', 'TAS': 'AU', 'VIC': 'AU', 'WA': 'US', 'AB': 'CA', 'BC': 'CA', 'MB': 'CA', 'NB': 'CA', 'NL': 'CA', 'NS': 'CA', 'NU': 'CA', 'ON': 'CA'}

res = {}

for code in codes:
    res[code] = [key for key, value in zone_to_code.items() if value == code]

print(res)

можно поджать

res = dict((code, [key for key, value in zone_to_code.items() if value == code]) for code in codes)
→ Ссылка
Автор решения: splash58

немного другими словами :)

res = {}
{self.setdefault(x, []).append(y) for y, x in zone_to_code.items() if x in codes}
print(res)
→ Ссылка