Создание словарей Python с ключами на основе элементов в списке списка

#python #python-3.x #list #dictionary #defaultdict

#python #python-3.x #Список #словарь #defaultdict

Вопрос:

Я создаю словарь, в котором, если ключ имеет 'R' один список, в противном случае он попадает в список for 'E' . Мой код до сих пор:

 d1 = {'SSW 540': ['E', 'SYEN'], 'SSW 564': ['R', 'SFEN'], 'SSW 567': ['R', 'SFEN'], 'CS 501': ['E', 'SFEN']}

rlist = []
elist = []

for k, v in d1.items():
    if v[0] == 'R':
        rlist.append([v[1], k])
    elif v[0] == 'E':
        elist.append([v[1], k])
  

Вывод:

 rlist = [['SFEN', 'SSW 564'], ['SFEN', 'SSW 567']]
elist = [['SYEN', 'SSW 540'], ['SFEN', 'CS 501']]
  

Как я могу создать два словаря, вызвать их rdict и edict где:

 rdict = {'SFEN': ['SSW 564','SSW 567']}
edict = {'SYEN': ['SSW 540'], 'SFEN': ['CS 501']}
  

Может быть больше значений, чем просто 'SYEN' , и 'SFEN' поэтому он должен быть любым конкретным первым элементом в списке.

Если я попробую что-то вроде:

 mlist = {}

for list in rlist:
    if list[0] in rlist:
        mlist.append(list[1])
    else:
        mlist[list[0]].append(list[1])
  

Я получаю KeyError: 'SFEN' . Могу ли я использовать defaultdict для этого?

Комментарии:

1. Вы можете использовать dict.setdefault

Ответ №1:

Существует способ создания m_dict из d1 напрямую.

 d1 = {
    'SSW 540': ['E', 'SYEN'],
    'SSW 564': ['R', 'SFEN'],
    'SSW 567': ['R', 'SFEN'],
    'CS 501': ['E', 'SFEN'],
}

m_dict = {}
for value, (category, key) in d1.items():
    m_dict.setdefault(category, {}).setdefault(key, []).append(value)

print(m_dict)
  

вывод:

 {'E': {'SYEN': ['SSW 540'], 'SFEN': ['CS 501']}, 'R': {'SFEN': ['SSW 564', 'SSW 567']}}
  

Объяснение:

  • dict.setdefault(key, default)
    • Он устанавливается на key by default , если key не существует.
    • И всегда возвращает значение key самого себя.
  • for value, (category, key) in d1.items():
    • Вы можете распаковать кортеж фиксированной длины, список или другие последовательности.
    • Таким образом, это эквивалентно:
 for value, tuple_ in d1.items():
    category, key = tuple_
  

Комментарии:

1. Этот ответ прекрасен!