Python. Как отсортировать словарь внутри словаря по ключам?
Существует словарь с ключами которые обозначают ID. Внутри каждого словаря еще словарь с ключами ID который представляет ключ внешнего словаря и USERS который представляет лист кортежей.
example = {
'010': {
ID: '010',
USERS: [('Albert', 'Nolan')]'},
'002': {
ID: '002',
USERS: [('Ginger', 'Bread'), ('Deus', 'Bexs')]},
'999': {
ID: '999',
USERS: [('Pede', 'Kordo'), ('Deus', 'Bexs'),
('Bister', 'Stre')]},
'021': {
ID: '021',
USERS: [('Pede', 'Kordo'), ('Bister', 'Stre')]},
'015': {
ID: '015',
USERS: []}
}
Нужно создать функцию которая будет сортировать словарь по юзерам и ID к которым они привязаны.
Пример сортировки:
sort_by_user = {
('Pede', 'Kordo'):['004', '999'],
('Bister', 'Stre'): ['004', '999'],
('Deus', 'Bexs'): ['002', '999'],
('Albert', 'Nolan'): ['010'],
('Ginger', 'Bread'): ['002']
}
Помогите найти ошибки в коде ниже чтобы users_to_ids совпадал с sort_by_user
#Создание листа юзеров в алфавитном порядке [(USERS)]
users_list = []
for key in example:
if len(example[key][USERS]) == 1:
l.append(example[key][USERS][0])
elif len(example[key][USERS]) > 1:
for n in range(len(example[key][USERS])):
l.append(example[key][USERS][n])
elif len(example[key][USERS]) == 0:
None
#Удаление повторений в листе
if users_list:
users_list.sort()
last = users_list[-1]
for i in range(len(users_list)-2, -1, -1):
if last == users_list[i]:
del users_list[i]
else:
last = users_list[i]
#создание словаря {'ID': [(USERS)]}
ids_to_users = {}
for key in example:
ids_to_users [key] = example[key][USERS]
users_to_ids = {}
for key in ids_to_users :
for item in users_list:
if item in ids_to_users [key]:
users_to_ids[item] = users_to_ids.get(item, []) + [key]
print(users_to_ids)
{('Albert', 'Nolan'): ['010'], ('Deus', 'Bexs'): ['999'], ('Ginger', 'Bread'): ['002'], ('Bister', 'Stre'): ['021'], ('Pede', 'Kordo'): ['021']}
Проблема заключается в том, что под ключ USERS не попадают все ID которые совпадают
Ответы (1 шт):
Автор решения: GrAnd
→ Ссылка
Надо всего-лишь вместо
users_to_ids[item] = key
написать
users_to_ids[item] = users_to_ids.get(item, []) + [key]
Привожу на ваш же пример чтобы вы сами удостоверились, что это работает. (код местами подсокращён, но на содержимое переменных это не влияет)
ID = 'id'
USERS = 'users'
example = {
'010': {
ID: '010',
USERS: [('Albert', 'Nolan')]},
'002': {
ID: '002',
USERS: [('Ginger', 'Bread'), ('Deus', 'Bexs')]},
'999': {
ID: '999',
USERS: [('Pede', 'Kordo'), ('Deus', 'Bexs'),
('Bister', 'Stre')]},
'021': {
ID: '021',
USERS: [('Pede', 'Kordo'), ('Bister', 'Stre')]},
'015': {
ID: '015',
USERS: []}
}
#Создание листа юзеров в алфавитном порядке [(USERS)]
users_list = sum((item[USERS] for item in example.values()), [])
#Удаление повторений в листе
users_list = sorted(set(users_list))
#создание словаря {'ID': [(USERS)]}
ids_to_users = {item[ID]:item[USERS] for item in example.values()}
users_to_ids = {}
for item in example.values():
for user in item[USERS]:
users_to_ids[user] = users_to_ids.get(user, []) + [item[ID]]
print(users_to_ids)
{('Albert', 'Nolan'): ['010'],
('Ginger', 'Bread'): ['002'],
('Deus', 'Bexs'): ['002', '999'],
('Pede', 'Kordo'): ['999', '021'],
('Bister', 'Stre'): ['999', '021']}