Рубрики
Без рубрики

Python – Как сортировать список словарей?

В этой статье вы узнаете INS и ауты сортировки в Python. В частности, вы собираетесь узнать, как сортировать список словарей во всех возможных вариациях. [1] Так что давайте начнем! https://youtu.be/ayyvcvmv7vq Как сортировать список словарей … … … По стоимости? Проблема: Учитывая список словарей. … Python – Как сортировать список словарей? Прочитайте больше “

Автор оригинала: Chris.

В этой статье вы узнаете INS и ауты сортировки в Python. В частности, вы собираетесь учиться Как сортировать список словарей во всех возможных вариациях. [ 1 Несомненно Так что давайте начнем!

Как сортировать список словарей …

… По стоимости?

Проблема : Учитывая список словарей. Каждый словарь состоит из нескольких (ключ, стоимости) пар. Вы хотите отсортировать их по значению определенного ключа словаря ( атрибут ). Как вы сортируете этот словарь?

Минимальный пример : Рассмотрим следующий пример, где вы хотите отсортировать список складских наплат по значению ключа «Алиса» Отказ

salaries = [{'Alice': 100000, 'Bob': 24000},
            {'Alice': 121000, 'Bob': 48000},
            {'Alice': 12000, 'Bob': 66000}]

sorted_salaries = # ... Sorting Magic Here ...

print(sorted_salaries)

Вывод должен выглядеть так, где зарплата Алисы определяет порядок словарей:

[{'Alice': 12000, 'Bob': 66000},
{'Alice': 100000, 'Bob': 24000},
{'Alice': 121000, 'Bob': 48000}]

Решение : У вас есть два основных способа сделать это – оба основаны на определении ключевой функции методов сортировки Python. Основная функция отображает каждый элемент списка (в нашем случае словарь) к одному значению, которое можно использовать в качестве основы сравнения.

  • Используйте функцию лямбда в качестве функции ключа, чтобы сортировать список словарей.
  • Используйте функцию itemgetter в качестве ключевой функции для сортировки списка словарей.

Вот код первого варианта, используя функцию лямбда, которая возвращает значение ключа «Алиса» из каждого словаря:

# Create the dictionary of Bob's and Alice's salary data
salaries = [{'Alice': 100000, 'Bob': 24000},
            {'Alice': 121000, 'Bob': 48000},
            {'Alice': 12000, 'Bob': 66000}]

# Use the sorted() function with key argument to create a new dic.
# Each dictionary list element is "reduced" to the value stored for key 'Alice'
sorted_salaries = sorted(salaries, key=lambda d: d['Alice'])

# Print everything to the shell
print(sorted_salaries)

Вывод – это сортированный словарь. Обратите внимание, что первый словарь имеет самую маленькую зарплату Алисы, а третий словарь имеет наибольшую зарплату Алисы.

[{'Alice': 12000, 'Bob': 66000},
 {'Alice': 100000, 'Bob': 24000},
 {'Alice': 121000, 'Bob': 48000}]

Попробуй сам:

Вы узнаете о втором пути ниже (где вы используете itemgetter Функция из оператора Module).

Сопутствующие статьи на блоге Finxter:

  • Сортировка списков в Python
  • Лямбда функции
  • Словарь с

… Использование itemgetter?

Та же проблема : Учитывая список словарей. Каждый словарь состоит из нескольких (ключ, стоимости) пар. Как сортировать их по значению определенного ключа словаря ( Атрибут )?

Минимальный пример : Рассмотрим еще раз в следующем примере, где вы хотите отсортировать список условных наплат по значению ключа «Алиса» Отказ

salaries = [{'Alice': 100000, 'Bob': 24000},
            {'Alice': 121000, 'Bob': 48000},
            {'Alice': 12000, 'Bob': 66000}]

sorted_salaries = # ... Sorting Magic Here ...

print(sorted_salaries)

Вывод должен выглядеть так, где зарплата Алисы определяет порядок словарей:

[{'Alice': 12000, 'Bob': 66000},
{'Alice': 100000, 'Bob': 24000},
{'Alice': 121000, 'Bob': 48000}]

Решение : Опять же, вы собираетесь определить ключевую функцию. Но вместо того, чтобы создавать его самостоятельно с лямбда Ключевое слово, вы собираетесь использовать существующий. В частности, вы будете использовать itemgetter Функция из Оператор Модуль для сортировки списка словарей.

Вот код первого варианта, используя функцию лямбда, которая возвращает значение ключа «Алиса» из каждого словаря:

# Import the itemgetter function from the operator module
from operator import itemgetter

# Create the dictionary of Bob's and Alice's salary data
salaries = [{'Alice': 100000, 'Bob': 24000},
            {'Alice': 121000, 'Bob': 48000},
            {'Alice': 12000, 'Bob': 66000}]

# Use the sorted() function with key argument to create a new dic.
# Each dictionary list element is "reduced" to the value stored for key 'Alice'
sorted_salaries = sorted(salaries, key=itemgetter('Alice'))

# Print everything to the shell
print(sorted_salaries)

Вывод – это сортированный словарь. Обратите внимание, что первый словарь имеет самую маленькую зарплату Алисы, а третий словарь имеет наибольшую зарплату Алисы.

[{'Alice': 12000, 'Bob': 66000},
 {'Alice': 100000, 'Bob': 24000},
 {'Alice': 121000, 'Bob': 48000}]

Теперь вы знаете, как сортировать список словарей по значению. Но что, если вы хотите сортировать по ключу?

… По ключу?

Проблема : Учитывая список словарей. Каждый словарь состоит из нескольких (ключ, стоимости) пар. Как отсортировать их по определенному ключу ( атрибут )?

Решение : Это не имеет смысла. Если вы предполагаете, что все словари имеют тот же самый конкретный ключ, вы не можете действительно отсортировать, потому что все словари имеют один и тот же ключ. Если нет Tie-выключателя, это невозможно сделать. Но даже если есть галстук (например, значение, связанное с ключом), оно не имеет смысла, потому что вы могли бы отсортировать по значению в первую очередь.

… По нескольким ключам?

Проблема : Учитывая список словарей. Как вы сортируете по нескольким парам ключевых значений?

Минимальный пример : Рассмотрим следующий пример, где вы хотите сортировать список записей баз данных (например, каждый хранится в виде словаря) по значению ключа «Имя пользователя» Отказ Если «Имя пользователя» то же самое, вы используете «Присоединился к» ценность как цевенператор. Если «Присоединился к» Дата то же самое, вы используете «Возраст» как галстук.

db = [{'username': 'Alice', 'joined': 2020, 'age': 23},
      {'username': 'Bob', 'joined': 2018, 'age': 19},
      {'username': 'Alice', 'joined': 2020, 'age': 31}]

sorted_salaries = # ... Sorting Magic Here ...

print(sorted_salaries)

Вывод должен выглядеть так, где зарплата Алисы определяет порядок словарей:

[{'username': 'Alice', 'joined': 2020, 'age': 23},
 {'username': 'Alice', 'joined': 2020, 'age': 31},
 {'username': 'Bob', 'joined': 2018, 'age': 19}]

Решение : Вы собираетесь определить функцию ключа с лямбда ключевое слово. Но вместо того, чтобы вернуть одно значение до данного ключа, вы возвращаете запись Tuple-One за значение, которое следует учитывать. Например, вход в базе данных {«Имя пользователя»: «Алиса», «Присоединился»: 2020, «Возраст»: 23} сопоставлен на («Алиса», 2020, 23) Отказ Это гарантирует, что две кортежи, которые имеют одинаковое первое значение кортежного кортежа, все равно будут сортироваться правильно, используя второе значение кортежного корпуса в виде Tiefreaker.

Вот код:

# Create the dictionary of user entries in your database
db = [{'username': 'Alice', 'joined': 2020, 'age': 23},
      {'username': 'Bob', 'joined': 2018, 'age': 19},
      {'username': 'Alice', 'joined': 2020, 'age': 31}]

# Use the sorted() function with key argument to create a new list.
# Each dictionary list element is "reduced" to the tuple of values.
db_sorted = sorted(db, key=lambda row: (row['username'],
                                        row['joined'],
                                        row['age']))

# Print everything to the shell
print(db_sorted)

Вывод – это сортированный словарь. Обратите внимание, что первый словарь имеет самую маленькую зарплату Алисы, а третий словарь имеет наибольшую зарплату Алисы.

[{'username': 'Alice', 'joined': 2020, 'age': 23}, 
{'username': 'Alice', 'joined': 2020, 'age': 31}, 
{'username': 'Bob', 'joined': 2018, 'age': 19}]

В этом примере значение словаря для ключа «Присоединилось» было целым числом. Но что, если это дата?

… По дате?

Проблема : Учитывая список словарей. Как вы сортируете список словарей по Дата ?

Минимальный пример : Рассмотрим следующий пример, где вы хотите сортировать список записей баз данных (например, каждый хранится в виде словаря) по значению ключа «Присоединился к» это из типа типовой даты или разум.

db = [{'username': 'Alice', 'joined': '2019-03-02', 'age': 23},
      {'username': 'Bob', 'joined': '2020-08-08', 'age': 19},
      {'username': 'Alice', 'joined': '2019-03-04', 'age': 31}]

db_sorted = # ... sorting magic here ...

print(db_sorted)

Вывод должен выглядеть так, где зарплата Алисы определяет порядок словарей:

[{'username': 'Alice', 'joined': '2019-03-02', 'age': 23},
 {'username': 'Alice', 'joined': '2019-03-04', 'age': 31},
 {'username': 'Bob', 'joined': '2020-08-08', 'age': 19}]

Решение : Определите функцию ключа с лямбда ключевое слово. Просто верните строковое значение для ключа «Присоединился к» для данного словаря. Это возвращаемое значение затем используется для сортировки словарей в списке.

Когда даты присоединения даны как строки в форме года в день месяца (например, '2020-08-08' ), по умолчанию алфавитный сорт также приведет к отсортированному общему списку словарей: Строкарь с Самая ранняя дата регистрации будет первым в результирующем списке.

Вот код:

# Create the dictionary of user entries in your database
db = [{'username': 'Alice', 'joined': '2019-03-02', 'age': 23},
      {'username': 'Bob', 'joined': '2020-08-08', 'age': 19},
      {'username': 'Alice', 'joined': '2019-03-04', 'age': 31}]

# Use the sorted() function with key argument to create a new list.
# Each dictionary list element is "reduced" to the join date.
db_sorted = sorted(db, key=lambda row: row['joined'])

# Print everything to the shell
print(db_sorted)

Вывод – это сортированный словарь. Обратите внимание, что первый словарь имеет самый ранний, а третий словарь имеет последнее дату регистрации.

[{'username': 'Alice', 'joined': '2019-03-02', 'age': 23},
 {'username': 'Alice', 'joined': '2019-03-04', 'age': 31},
 {'username': 'Bob', 'joined': '2020-08-08', 'age': 19}]

Вы можете использовать аналогичный метод, если значения словаря имеют формат DateTime, поскольку они также сопоставимы с операторами сравнения по умолчанию > , < , > = , <= и знак равно = Отказ [ 2 Несомненно

… В порядке убывания?

Проблема : По умолчанию упорядочение любого списка Python List ( Сортировка () и list.sort () ) находится в порядке возрастания. Это также держит, если вы сортируете список словарей. Как вы можете отказаться в порядке убывания?

Решение : Если вы хотите разобраться в порядке убывания, вы можете сделать одно из следующих действий:

  • Используйте Slicing, чтобы изменить отсортированный список.
  • Используйте аргумент отсортировано () или list.sort () методы.

Оба пути эквивалентны. Посмотрите на предыдущий пример сначала используя обратный аргумент:

# Create the dictionary of user entries in your database
db = [{'username': 'Alice', 'joined': '2019-03-02', 'age': 23},
      {'username': 'Bob', 'joined': '2020-08-08', 'age': 19},
      {'username': 'Alice', 'joined': '2019-03-04', 'age': 31}]

# Use the sorted() function with key argument to create a new list.
# Each dictionary list element is "reduced" to the join date.
db_sorted = sorted(db, key=lambda row: row['joined'], reverse=True)

# Print everything to the shell
print(db_sorted)

Выход:

[{'username': 'Bob', 'joined': '2020-08-08', 'age': 19}, 
{'username': 'Alice', 'joined': '2019-03-04', 'age': 31}, 
{'username': 'Alice', 'joined': '2019-03-02', 'age': 23}]

И второе использование нарезки с отрицательным размером шага (без обратного аргумента):

# Create the dictionary of user entries in your database
db = [{'username': 'Alice', 'joined': '2019-03-02', 'age': 23},
      {'username': 'Bob', 'joined': '2020-08-08', 'age': 19},
      {'username': 'Alice', 'joined': '2019-03-04', 'age': 31}]

# Use the sorted() function with key argument to create a new list.
# Each dictionary list element is "reduced" to the join date.
db_sorted = sorted(db, key=lambda row: row['joined'])[::-1]

# Print everything to the shell
print(db_sorted)

Тот же выход:

[{'username': 'Bob', 'joined': '2020-08-08', 'age': 19}, 
{'username': 'Alice', 'joined': '2019-03-04', 'age': 31}, 
{'username': 'Alice', 'joined': '2019-03-02', 'age': 23}]

… в порядке возрастания?

Заказ по умолчанию любого списка Python List ( Сортировка () и list.sort () ) находится в порядке возрастания. Это также держит, если вы сортируете список словарей.

Статьи по Теме:

  • Окончательное руководство по спискам Python

Куда пойти отсюда

В этой статье вы узнали, как сортировать список словарей. Таким образом, используйте отсортировано () Способ с функцией ключа в качестве аргумента. Это дает вам гибкость для настройки того, как именно вы хотите отсортировать словарь-просто карта каждого словаря к сопоставимому значению.

Я понял, что профессиональные кодеры, как правило, используют словари чаще, чем начинающим из-за их превосходного понимания преимуществ словарей. Если вы хотите узнать о тех, ознакомьтесь с моим углубленным учебником словарей Python.

Если вы хотите прекратить обучение и начать зарабатывать с Python, проверьте мой бесплатный вебинар «Как стать бесцеретный разработчик Python?» Отказ Это отличный способ начать процветающий кодирующий бизнес онлайн.

«[Вебинар] Как стать бесцеретный разработчик Python?»

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.