Сортировка по произвольной лямбде

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

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

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

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

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

46
задан Bhargav Rao 14 January 2016 в 18:15
поделиться

5 ответов

В принципе, у вас уже есть:

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

gives:

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

Это отсортирует mylist на месте.

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

49
ответ дан 26 November 2019 в 20:30
поделиться

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

mylist.sort(key=lambda x: x[1]) # In place sort
new_list = sorted(mylist, key=lambda x: x[1])
9
ответ дан 26 November 2019 в 20:30
поделиться

Ответ - использовать "sorted", т.е.

sorted(mylist, key=lambda x: x[1])
4
ответ дан 26 November 2019 в 20:30
поделиться

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

from operator import itemgetter
mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
mylist.sort(key=itemgetter(1)) # or sorted(mylist, key=...)
9
ответ дан 26 November 2019 в 20:30
поделиться

Сортировка и itemgetter - самые быстрые.

>>> 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
5
ответ дан 26 November 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: