straton
Март 27, 2010 15:43:12
Недавно начал изучать python 3.1
Подскажите, как отсортировать список из кортежей по определенному элементу кортежа, например:
a =
если отсортировать по второму элементу кортежа, то получится:
как сделать такую сортировку в python 3.1 (не так, чтобы писать свою функцию, а стандартными средствами)
рылся в документации, мало чего нашел. в python 2.6 был какой-то необязательный аргумент, задававший пользовательскую функцию сравнения
Griffon
Март 27, 2010 21:45:28
def cmp(x, y):
return 1 if x[1] > y[1] else -1 if x[1] < y[1] else 0
a = [ (1, 2, 3), (2, 7, 2), (3, 1, 7)]
a.sort(cmp)
Александр Кошелев
Март 27, 2010 23:14:13
Griffonsort не принимает cmp начиная с 3.0
stratonВ sort можно передать функтор key, который должен возвращать для каждого элемента значение по которому идет сортировка.
a = [ (1, 2, 3), (2, 7, 2), (3, 1, 7) ]
a.sort(key=lambda item: item[1])
pyuser
Март 28, 2010 04:04:52
Daevaorn
В sort можно передать функтор key, который должен возвращать для каждого элемента значение по которому идет сортировка.
я думаю в данном случае вместо lambda “правильнее” будет:
from operator import itemgetter
a = [ (1, 2, 3), (2, 7, 2), (3, 1, 7) ]
a.sort(key=itemgetter(1))
straton
Март 28, 2010 16:33:03
спасибо, оба способа работают
а можете поподробней объяснить, что это за аргумент - “key” и какого типа должны быть его значения?
Griffon
Март 28, 2010 17:19:21
Я так понял что функция сортирует не по значениям, а по ключам этих значений. То есть для любого вида данных можно функцией формировать ключ, по которому и будет производиться сортировка. Тип данных вроде как int.
Zubchick
Март 28, 2010 20:37:38
тип данных как бы любой который можно сравнить между собой.