Как отсортировать мой словарь, используя это условие

#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 Пожалуйста, проверьте и мой ответ.