У меня есть список словарей и хочу, чтобы каждый элемент сортировался по определенным значениям свойств.
Примите во внимание массив ниже,
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
Когда отсортировано по name
, должно стать
[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
[{'name':'Bart', 'age':10, 'note':3},{'name':'Homer','age':10,'note':2},{'name':'Vasile','age':20,'note':3}]
And для использования:from operator import itemgetter newlist = sorted(old_list, key=itemgetter(-'note','name')
EDIT: протестировано, и оно работает, но я не знаю, как сделать заметку DESC и назвать ASC.Ответы:
Это может выглядеть чище, используя ключ вместо cmp:
или, как предложил JFSebastian и другие,
Для полноты (как указано в комментариях fitzgeraldsteele) добавьте
reverse=True
сортировку по убываниюисточник
itemgetter(i)
гдеi
индекс элемента кортежа для сортировки.itemgetter
принимает более одного аргумента:itemgetter(1,2,3)
это функция, которая возвращает подобный кортежуobj[1], obj[2], obj[3]
, поэтому вы можете использовать его для выполнения сложных сортировок.Чтобы отсортировать список словарей по ключу = 'name':
Чтобы отсортировать список словарей по ключу = 'возраст':
источник
key=lambda k: (k['name'], k['age'])
. (илиkey=itemgetter('name', 'age')
). кортежиcmp
будут сравнивать каждый элемент по очереди. это чертовски блестящеkey
аргумент дляlist.sort()
не описан. Есть идеи, где это найти?list
друзей.my_list
теперь будет то, что вы хотите.(3 года спустя) Отредактировано, чтобы добавить:
Новый
key
аргумент более эффективен и аккуратен. Лучший ответ теперь выглядит так:... лямбда, IMO, легче понять, чем
operator.itemgetter
, но YMMV.источник
Если вы хотите отсортировать список по нескольким ключам, вы можете сделать следующее:
Он довольно хакерский, так как он основан на преобразовании значений в одно строковое представление для сравнения, но он работает, как и ожидалось, для чисел, в том числе и отрицательных (хотя вам нужно будет правильно отформатировать строку с нулевыми дополнениями, если вы используете числа)
источник
«ключ» используется для сортировки по произвольному значению, а «itemgetter» устанавливает это значение для атрибута «name» каждого элемента.
источник
источник
Я полагаю, вы имели в виду:
Это будет отсортировано так:
источник
Вы можете использовать пользовательскую функцию сравнения или передать функцию, которая вычисляет пользовательский ключ сортировки. Это обычно более эффективно, поскольку ключ рассчитывается только один раз для каждого элемента, тогда как функция сравнения будет вызываться много раз.
Вы можете сделать это следующим образом:
Но стандартная библиотека содержит общую процедуру для получения элементов произвольных объектов:
itemgetter
. Так что попробуйте это вместо:источник
Используя преобразование Шварца из Perl,
делать
дает
Подробнее о преобразовании Perl Schwartzian
источник
key=
for.sort
с 2.4, то есть с 2004 года, он выполняет преобразование Шварца в коде сортировки в C; таким образом, этот метод полезен только на Pythons 2.0-2.3. всем из которых более 12 лет.Вы должны реализовать собственную функцию сравнения, которая будет сравнивать словари по значениям именных ключей. Смотрите Сортировка Mini-HOW TO из PythonInfo Wiki
источник
когда-нибудь нам нужно использовать,
lower()
например,источник
Вот альтернативное общее решение - оно сортирует элементы dict по ключам и значениям. Преимущество этого - нет необходимости указывать ключи, и оно все равно будет работать, если в некоторых словарях отсутствуют некоторые ключи.
источник
Использование пакета pandas - это еще один метод, хотя в широком масштабе его время выполнения намного медленнее, чем у традиционных методов, предложенных другими:
Вот некоторые эталонные значения для крошечного списка и большого списка (более 100 тыс.):
источник
Если вам не нужен оригинал
list
изdictionaries
, вы можете изменить его в месте сsort()
методом , используя пользовательскую функцию ключа.Ключевая функция:
list
Для сортировки:Сортировка по месту:
Если вам нужен оригинал
list
, вызовитеsorted()
функцию, передающую ему функциюlist
and и key, затем присвойте возвращенный отсортированныйlist
новой переменной:Печать
data_one
иnew_data
.источник
Допустим, у меня есть словарь
D
с элементами ниже. Для сортировки просто используйте ключевой аргумент в sorted для передачи пользовательской функции, как показано ниже:Проверьте это .
источник
Я был большим поклонником фильтра с лямбдой, но это не лучший вариант, если вы рассматриваете сложность времени
Первый вариант
Второй вариант
Быстрое сравнение времени исполнения
источник
Если речь идет о производительности, я бы использовал
operator.itemgetter
вместоlambda
встроенных функций быстрее, чем ручной.itemgetter
Похоже, что эта функция работает примерно на 20% быстрее, чемlambda
по результатам моего тестирования.С https://wiki.python.org/moin/PythonSpeed :
Вот сравнение сортировки скорости , используя
lambda
противitemgetter
.Оба метода сортируют список в одном и том же порядке (проверяется выполнением последнего оператора в блоке кода), но один немного быстрее.
источник
Вы можете использовать следующий код
источник