Как отсортировать список словарей по значению словаря в Python?

Я получил список словарей и хочу, чтобы каждый элемент сортировался по значениям определенного свойства

Примите во внимание массив ниже,

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

Когда отсортировано по name, должно стать

[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
вопрос задан 16.09.2008
masi
108 репутация

17 ответов


  • 0 рейтинг

    Я полагаю, вы имели в виду:

    [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
    

    Это будет отсортировано так:

    sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))
    
    ответ дан Bartosz Radaczyński, с репутацией 10571, 16.09.2008
  • 0 рейтинг

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

    ответ дан hughdbrown, с репутацией 29801, 17.07.2009
  • 0 рейтинг

    Я пробовал что-то вроде этого:

    my_list.sort(key=lambda x: x['name'])
    

    Это сработало и для целых чисел.

    ответ дан Sandip Agarwal, с репутацией 1180, 14.09.2012
  • 0 рейтинг
    my_list = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
    
    my_list.sort(lambda x,y : cmp(x['name'], y['name']))
    

    my_list теперь будет то, что вы хотите.

    (3 года спустя) Отредактировано, чтобы добавить:

    Новый аргумент key является более эффективным и аккуратным. Лучший ответ теперь выглядит так:

    my_list = sorted(my_list, key=lambda k: k['name'])
    

    . , , Лямбда, IMO, легче понять, чем operator.itemgetter, но YMMV.

    ответ дан pjz, с репутацией 28591, 16.09.2008
  • 0 рейтинг

    Это может выглядеть чище, если вместо ключа использовать ключ:

    newlist = sorted(list_to_be_sorted, key=lambda k: k['name']) 
    

    или как J. F. Себастьян и другие предложили,

    from operator import itemgetter
    newlist = sorted(list_to_be_sorted, key=itemgetter('name')) 
    

    Для полноты (как указано в комментариях fitzgeraldsteele), добавьте reverse=True для сортировки по убыванию

    newlist = sorted(l, key=itemgetter('name'), reverse=True)
    
    ответ дан Mario F, с репутацией 25327, 16.09.2008
  • 0 рейтинг
    import operator
    a_list_of_dicts.sort(key=operator.itemgetter('name'))
    

    «ключ» используется для сортировки по произвольному значению, а «itemgetter» устанавливает это значение в атрибут «name» каждого элемента.

    ответ дан efotinis, с репутацией 11596, 16.09.2008
  • 0 рейтинг

    Если вы хотите отсортировать список по нескольким ключам, вы можете сделать следующее:

    my_list = [{'name':'Homer', 'age':39}, {'name':'Milhouse', 'age':10}, {'name':'Bart', 'age':10} ]
    sortedlist = sorted(my_list , key=lambda elem: "%02d %s" % (elem['age'], elem['name']))
    

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

    ответ дан Dologan, с репутацией 2288, 18.05.2010
  • 0 рейтинг

    Использование преобразования Шварца из Perl,

    py = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
    

    до

    sort_on = "name"
    decorated = [(dict_[sort_on], dict_) for dict_ in py]
    decorated.sort()
    result = [dict_ for (key, dict_) in decorated]
    

    дает

    >>> result
    [{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]
    

    Подробнее о Perl Schwartzian transform

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

    ответ дан octoback, с репутацией 13234, 27.05.2013
  • 0 рейтинг

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

    Вы можете сделать это следующим образом:

    def mykey(adict): return adict['name']
    x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
    sorted(x, key=mykey)
    

    Но стандартная библиотека содержит общую процедуру для получения элементов произвольных объектов: itemgetter. Так что попробуйте это вместо:

    from operator import itemgetter
    x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
    sorted(x, key=itemgetter('name'))
    
    ответ дан Owen, с репутацией 531, 16.09.2008
  • 0 рейтинг

    Необходимо реализовать собственную функцию сравнения, которая будет сравнивать словари по значениям именных ключей. См. Сортировка Mini-HOW TO из PythonInfo Wiki

    ответ дан Matej, с репутацией 3878, 16.09.2008
  • 0 рейтинг
    import operator
    

    Сортировать список словарей по ключу = 'name':

    list_of_dicts.sort(key=operator.itemgetter('name'))
    

    Сортировать список словарей по ключу = 'age':

    list_of_dicts.sort(key=operator.itemgetter('age'))
    
    ответ дан Owen, с репутацией 531, 16.09.2008