#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
bydefault
, еслиkey
не существует. - И всегда возвращает значение
key
самого себя.
- Он устанавливается на
for value, (category, key) in d1.items():
- Вы можете распаковать кортеж фиксированной длины, список или другие последовательности.
- Таким образом, это эквивалентно:
for value, tuple_ in d1.items():
category, key = tuple_
Комментарии:
1. Этот ответ прекрасен!