Сортировка по произвольной лямбде - PullRequest
43 голосов
/ 10 июля 2010

Как мне отсортировать список по ключу, описанному произвольной функцией? Например, если у меня есть:

mylist = [["quux", 1, "a"], ["bar", 0, "b"]]

Я бы хотел отсортировать «mylist» по второму элементу каждого члена, например,

sort(mylist, key=lambda x: x[1])

как я могу это сделать?

Ответы [ 6 ]

46 голосов
/ 10 июля 2010

У вас уже есть это:

>>> mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
>>> mylist.sort(key=lambda x: x[1])
>>> print mylist

дает:

[['bar', 0, 'b'], ['quux', 1, 'a']]

Это отсортирует мой список на месте.

[этот пункт отредактирован благодаря исправлению @ Daniel.] sorted вернет новый список, который отсортирован, а не фактически изменяет ввод, как описано в http://wiki.python.org/moin/HowTo/Sorting/.

9 голосов
/ 10 июля 2010

Это настолько распространенная потребность, что его поддержка была добавлена ​​в стандартную библиотеку в виде operator.itemgetter:

from operator import itemgetter
mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
mylist.sort(key=itemgetter(1)) # or sorted(mylist, key=...)
9 голосов
/ 10 июля 2010

У вас есть два варианта, очень близких к тому, что вы описали, на самом деле:

mylist.sort(key=lambda x: x[1]) # In place sort
new_list = sorted(mylist, key=lambda x: x[1])
5 голосов
/ 10 июля 2010

Сортировка и поиск предметов самые быстрые.

>>> import operator
>>> import timeit

>>> mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
>>> t1 = timeit.Timer(lambda: mylist.sort(key=lambda x: x[1]))
>>> t1.timeit()
1.6330803055632404

>>> t2 = timeit.Timer(lambda: mylist.sort(key=operator.itemgetter(1)))
>>> t2.timeit()
1.3985503043467773

>>> t3 = timeit.Timer(lambda: sorted(mylist, key=operator.itemgetter(1)))
>>> t3.timeit()
2.6329514733833292

>>> t4 = timeit.Timer(lambda: sorted(mylist, key=lambda x: x[1]))
>>> t4.timeit()
2.9197154810598533
4 голосов
/ 10 июля 2010

Ответ должен использовать "отсортированный", то есть

sorted(mylist, key=lambda x: x[1])
1 голос
/ 10 мая 2019

Решение вашего вопроса: sorted_list = sorted(mylist, key=lambda value:value[1])

Решение для словаря списка:

mylist = [{'name':'kk', 'age':21},{'name':'bk', 'age':21}]

sorted_list = sorted(mylist, key=lambda k: k['key_name'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...