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

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

Когда вы работаете с данными в Python, иногда удобно иметь возможность сортировать список словарей. К счастью, я знаю, как это сделать! Tagged с Python, начинающими, учебником, кодированием.

Как сделать Python (серия 14 деталей)

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

Проблема введение

Как упоминалось ранее, я работал над анализом файла CSV для визуализации данных, и в итоге получил все, что хотел в следующем формате:

csv_mapping_list = [
  {
    "Name": "Jeremy",
    "Age": 25,
    "Favorite Color": "Blue"
  },
  {
     "Name": "Ally",
     "Age": 41,
     "Favorite Color": "Magenta"
  },
  {
    "Name": "Jasmine",
    "Age": 29,
    "Favorite Color": "Aqua"
  }
]

Конечно, наличие данных в хорошем формате и фактическое использование этих данных для визуализации – очень разные проблемы. Другими словами, у нас есть наши данные, но мы могли бы использовать его подмножество. Аналогичным образом, порядок данных может иметь значение.

Например, мы могли бы заказать наши точки данных по возрасту. Таким образом, мы могли бы построить их в порядке увеличения или снижения возраста, чтобы увидеть, сможем ли мы определить какие -либо тенденции. Например, возможно, пожилые люди предпочитают определенные цвета, или, возможно, у молодых людей есть определенные типы имен.

В любом случае, мы всегда должны начинать с обработки данных. Сегодня я хочу сосредоточиться на сортировке списка словари.

Решения

Как всегда, мне нравится делиться многими возможными решениями. Для меня нормально поделиться методом грубой силы, за которым следует еще пара элегантных методов, поэтому при необходимости запустите, чтобы пропустить вперед.

Сортировка списка словарей вручную

Сортировка, вероятно, является одной из самых исследованных областей информатики, поэтому мы не будем погружаться в философию. Вместо этого мы используем один из наиболее популярных алгоритмов, сортировка отбора:

size = len(csv_mapping_list)
for i in range(size):
    min_index = i
    for j in range(i + 1, size):
        if csv_mapping_list[min_index]["Age"] > csv_mapping_list[j]["Age"]:
            min_index = j    
    temp = csv_mapping_list[i]
    csv_mapping_list[i] = csv_mapping_list[min_index]
    csv_mapping_list[min_index] = temp

Здесь мы отсортировали список словарей по возрасту. Для этого мы используем «возрастное» поле каждого словаря, как видно в строке 5.

С тех пор, как я изучаю эту тему, я обнаружил, что у Python есть хороший способ обработки переменной подсасывания в одной строке кода:

size = len(csv_mapping_list)
for i in range(size):
    min_index = i
    for j in range(i + 1, size):
        if csv_mapping_list[min_index]["Age"] > csv_mapping_list[j]["Age"]:
            min_index = j
    csv_mapping_list[i], csv_mapping_list[min_index] = csv_mapping_list[min_index], csv_mapping_list[i]

Очевидно, я не выбрал это отличное имя переменной для обмена, но вы поняли идею. Чтобы выполнить обмен, мы используем упаковку и распаковку тупе. Другими словами, мы создаем кортеж с правой стороны выражения и распаковываем его на левой стороне выражения. Довольно крутые вещи!

Сортировка списка словарей с функцией сортировки

К счастью для нас, нам не нужно реализовать сортировку вручную в Python. Вместо этого мы можем использовать функцию «Сорта» для списков. В следующем фрагменте мы сортируем список словарей по возрасту.

csv_mapping_list.sort(key=lambda item: item.get("Age"))

Здесь мы должны указать ключевой параметр, поскольку словари не могут быть естественно отсортированы. Или, как сообщает интерпретатор Python:

Traceback (most recent call last):
  File "", line 1, in 
    csv_mapping_list.sort()
TypeError: '<' not supported between instances of 'dict' and 'dict'

Чтобы решить эту проблему, мы используем параметр ключа. Параметр ключа позволяет нам предоставить функцию, которая возвращает некоторое значение для каждого элемента в нашем списке. В этом случае естественное упорядочение каждого словаря отображается на возрастное поле каждого элемента с использованием встроенной функции лямбда.

Как и ожидалось, список словарей отсортируется следующим образом:

[
  {
    'Name': 'Jeremy', 
    'Age': 25, 
    'Favorite Color': 'Blue'
  }, 
  {
    'Name': 'Jasmine', 
    'Age': 29, 
    'Favorite Color': 'Aqua'
  }, 
  {
    'Name': 'Ally', 
    'Age': 41, 
    'Favorite Color': 'Magenta'
  }
]

И это так же легко сортировать по любым другим ключам в этом отношении:

csv_mapping_list.sort(key=lambda item: item.get("Name"))
csv_mapping_list.sort(key=lambda item: item.get("Favorite Color"))

В обоих случаях список будет отсортирован «алфавитно», поскольку значения являются строками. Тем не менее, имейте в виду, что этот метод сорта чувствителен к случаям. Я написал целую отдельную статью для Работа с сортировкой строк Если вы заинтересованы в этом.

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

from operator import itemgetter
f = itemgetter('Name')
csv_mapping_list.sort(key=f)

Спасибо, Dmitrypolo, за совет!

Сортировка списка словарей с отсортированной функцией

Более общая версия встроенного сортировка Функция – это встроенный отсортировано функция Он работает точно так же, как сортировка Функция, но это работает для всех итерам. Другими словами, если бы наш список был на самом деле кортежом, у нас будет другой вариант:

csv_mapping_list = sorted(csv_mapping_list, key=lambda item: item("Age"))

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

Как Сортировать , отсортировано имеет тонну пользовательских опций, поэтому я рекомендую проверить Документация Python Если у вас более конкретная ситуация. В качестве альтернативы, вы можете протянуть руку в комментариях!

Немного резюме

Во время написания этой статьи я начал испытывать чувство дежавю. Затем я вспомнил, что уже написал статью о Сортировка списка строк в Python Анкет Видимо, все методы оттуда были так же применимы здесь. Во всяком случае, вот все решения, обсуждаемые в этой статье:

# Custom sorting
size = len(csv_mapping_list)
for i in range(size):
    min_index = i
    for j in range(i + 1, size):
        if csv_mapping_list[min_index]["Age"] > csv_mapping_list[j]["Age"]:
            min_index = j
    csv_mapping_list[i], csv_mapping_list[min_index] = csv_mapping_list[min_index], csv_mapping_list[i]

# List sorting function
csv_mapping_list.sort(key=lambda item: item.get("Age"))

# List sorting using itemgetter
from operator import itemgetter
f = itemgetter('Name')
csv_mapping_list.sort(key=f)

# Iterable sorted function
csv_mapping_list = sorted(csv_mapping_list, key=lambda item: item("Age"))

Как обычно, я ценю вашу поддержку. Если у вас есть какие -либо рекомендации для будущих статей, дайте мне знать в комментариях!

Как сделать Python (серия 14 деталей)

Оригинал: “https://dev.to/renegadecoder94/how-to-sort-a-list-of-dictionaries-in-python-5d05”