Сортировка словаря Python по значениям
Дано такой словарь:
{
"ff8bca1c-9640-49dd-9eed-4c9e045bb447": {
"messages": 7
},
"abb3e859-2df7-4dea-8640-d3a19ccf14d5": {
"messages": 30
},
"4598eca1-e2c3-4b29-aea7-275c98d7949d": {
"messages": 12
},
"f3a44385-c700-4c96-bb46-e1da9d53a64c": {
"messages": 29
},
"c698579a-869b-4f2b-93f3-c3dadac020a4": {
"messages": 2
},
"3e7bc03d-a2f6-4851-8c4c-a500d3aab1a2": {
"messages": 53
},
"7c25d5d0-e4a1-4589-8b89-00c7c54d7546": {
"messages": 9
},
"6f63e4ee-f46f-4cf2-b74c-847d1baef684": {
"messages": 9
}
}
Он записан в отдельном файле "users_data.json"
На всякий случай покажу как этот словарь изменяется и как эти значения туда попадают:
def add(uid):
data_file_path = os.getcwd() + '/users_data.json'
if not os.path.exists(data_file_path):
with open(data_file_path, 'w', encoding='UTF-8') as data_file:
data_file.write(json.dumps({}))
data_file.close()
with open(data_file_path, 'r', encoding='UTF-8') as data_file:
users_data = json.loads(data_file.read())
data_file.close()
if uid not in users_data:
users_data[uid] = {'messages': 1}
else:
users_data[uid]['messages'] += 1
with open(data_file_path, 'w', encoding='UTF-8') as data_file:
data_file.write(json.dumps(users_data, indent=2))
data_file.close()
return users_data[uid]['messages']
if message:
warning.add(authorid)
Нужно отсортировать этот словарь в зависимости от числа в 'messages'
Пробовал:
users_data_p = Path("users_data.json")
users_data = json.loads(users_data_p.read_text(encoding='utf-8'))
users_data = list(users_data.items())
users_data.sort()
for key, items in users_data:
print(key, "->", items)
(Цифры немного изменились в ходе тестирования, но суть в том что словарь не отсортирован как надо)
Ответы (3 шт):
Автор решения: Sergey Gornostaev
→ Ссылка
with open(data_file_path) as data_file:
users_data = json.load(data_file)
sorted_data = sorted(user_data.items(), key=lambda x: x[0]['messages'])
Автор решения: Servashu
→ Ссылка
import json
from pathlib import Path
users_data_p = Path("users_data.json")
users_data = json.loads(users_data_p.read_text(encoding='utf-8'))
users_data_list = list(users_data.items())
users_data_list.sort(key=lambda j: j[1].get('messages'))
for i in users_data_list:
print(i[0], '->', i[1])
Автор решения: bipll
→ Ссылка
$ python3
Python 3.8.2 (default, Apr 27 2020, 15:53:34)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = {"hi": {"messages": 7}, "lo": {"messages": 4}}
>>> a.items()
dict_items([('hi', {'messages': 7}), ('lo', {'messages': 4})])
>>> sorted(a.items(), key=lambda itm: itm[1]['messages'])
[('lo', {'messages': 4}), ('hi', {'messages': 7})]
