#python #python-3.x #dictionary #nested
#python #python-3.x #словарь #вложенный
Вопрос:
Как отсортировать мой словарь, используя это условие в python.
У меня есть вложенный словарь, который описан ниже.
my_dict={
"Moli": {"Price": 226, "Quantity": 300, "PreOrder": "Yes", "PostOrder": "No", "Dif": 36},
"Anna": {"Price": 530, "Quantity": 154, "PreOrder": "No", "PostOrder": "Yes", "Dif": 26},
"Bob": {"Price": 250, "Quantity": 100, "PreOrder": "No", "PostOrder": "No", "Dif": 46},
"Annie": {"Price": 656, "Quantity": 96, "PreOrder": "Yes", "PostOrder": "No", "Dif": 55},
"Calley": {"Price": 546, "Quantity": 76, "PreOrder": "No", "PostOrder": "Yes", "Dif": 35}
}
Я хочу применить условие к этому вложенному словарю. Условие_
Отсортируйте элементы, где («Предварительный заказ» == «Да» или «Последующий заказ» == «Да») и покажите эти элементы в порядке убывания, используя значение «Количество»
Что-то вроде этого.
my_dict2 = {("PreOrder"== "Yes" or "PostOrder"== "Yes") i[0]: i[1] for i in sorted(my_dict.items(), key=lambda x: x[1]["Quantity"], reverse=True)}
Я знаю, что это неправильный код.
ожидаемый результат_
my_dict2={
"Moli": {"Price": 226, "Quantity": 300, "PreOrder": "Yes", "PostOrder": "No", "Dif": 36},
"Anna": {"Price": 530, "Quantity": 154, "PreOrder": "No", "PostOrder": "Yes", "Dif": 26},
"Annie": {"Price": 656, "Quantity": 96, "PreOrder": "Yes", "PostOrder": "No", "Dif": 55},
"Calley": {"Price": 546, "Quantity": 76, "PreOrder": "No", "PostOrder": "Yes", "Dif": 35}
}
Я был бы очень признателен, если бы вы могли мне помочь
Комментарии:
1. это первое условие предназначено для фильтрации, а не для сортировки. Вам нужны только элементы с
"PreOrder"== "Yes" or "PostOrder"== "Yes"
?2. Почему
Bob
в вашем ожидаемом выводе отсутствует ключ?3. Поскольку у Боба («Предварительный заказ» == «Да» или «Последующий заказ» == «Да») это условие равно false. «Предварительный заказ»: «Нет», «Последующий заказ»: «Нет»
4. и да, сначала проверьте условие, затем сортируйте в порядке убывания, используя значение «Количество»
5. Могу ли я написать код следующим образом filtered = {i[0]: i[1] для i в sorted(my_dict.items(), key=lambda x: x[1][«Количество»], reverse=True), если i[1][«True» не вmy_dict[(список(my_dict.keys())[0])].values()]}
Ответ №1:
Это включает в себя несколько шагов, как вы описали. Во-первых, нам нужен dict только с теми элементами, которые мы хотим. Это фильтрует dict.
filtered = {k: v for k, v in my_dict.items() if v['PreOrder'] == 'Yes' or v['PostOrder'] == 'Yes'}
Затем вы хотите отобразить элементы по порядку. Это подразумевает список, а не словарь. Итак, мы создадим его с кортежами из исходного dict .
items = [(k, v) for k, v in filtered.items()]
Наконец, нам нужно отсортировать элементы. Как вы уже писали, sort
принимает любой произвольный метод сортировки, поэтому мы можем передать для этого лямбда-функцию.
ordered = sorted(items, key=lambda i: i[1]['Quantity'], reversed=True)
В общем, очень полезно подумать о своих проблемах минимальными шагами.
Комментарии:
1. кстати, вы можете сделать
sorted(filtered.items(), key=lambda i: i[1]['Quantity'])
2. @Chase Хорошая мысль! Я бы подчеркнул необходимость понимания смысла каждого шага, но как только вы освоитесь, можно создать такие ярлыки.
3. Кроме того, поскольку, если я не ошибаюсь, в версии 3.6, dicts сортируются, поэтому вместо списка можно получить dict .
4. Но, сэр, я получаю такой вывод_
5. @go2nirvana Верно, но лично мне все еще неудобно предполагать это, потому что структура данных не создана для этого. Например, при переключении на другие языки было бы проще выполнить переход с теми же понятиями, не полагаясь на упорядоченный dict .
Ответ №2:
Вы также можете сделать это с помощью pandas
library:
Это экономит много строк кода, а также значительно снижает сложность.
Установите pandas:
pip install pandas
Затем создайте фрейм данных из my_dict
:
In [229]: import pandas as pd
In [230]: df = pd.DataFrame(my_dict)
In [235]: df1 = df.T
In [244]: my_dict2 = df1[df1.PreOrder.eq('Yes') | df1.PostOrder.eq('Yes')].sort_values(by='Quantity', ascending=False).T.to_dict()
In [245]: my_dict2
Out[245]:
{'Moli': {'Price': 226,
'Quantity': 300,
'PreOrder': 'Yes',
'PostOrder': 'No',
'Dif': 36},
'Anna': {'Price': 530,
'Quantity': 154,
'PreOrder': 'No',
'PostOrder': 'Yes',
'Dif': 26},
'Annie': {'Price': 656,
'Quantity': 96,
'PreOrder': 'Yes',
'PostOrder': 'No',
'Dif': 55},
'Calley': {'Price': 546,
'Quantity': 76,
'PreOrder': 'No',
'PostOrder': 'Yes',
'Dif': 35}}
Комментарии:
1. @ammely Пожалуйста, проверьте и мой ответ.