Сортировка по значениям в подсписке в python - PullRequest
1 голос
/ 02 августа 2011

Мой список содержит несколько элементов в этом формате

(23, (12,16,42))

моя элементарная сортировка сейчас будет сортировать по первому значению в подсписке по умолчанию.

value = sorted(list, key=itemgetter(1))

Я хочуиспользовать опцию сортировки второго уровня, как описано http://wiki.python.org/moin/HowTo/Sorting/

sorted(student_tuples, key=itemgetter(1,2))

Так есть ли адрес для каждого из элементов в подсписке?Я пытался найти некоторые обозначения в скобках или двоеточии и просто еще не заметил их, я предполагаю.

Пример несортированного списка

(0, (81.0, 5.0, 83.0)), (1, (81.0, 1.0, 26.0)), (2, (80.0, 1.0, 44.0)), 

вывод будет похож на

(2, (80.0, 1.0, 44.0)), (1, (81.0, 1.0, 26.0)), (0, (81.0, 5.0, 83.0))

(w, (x,y,z))

, поэтому первая сортировка по x.Если существует несколько значений x, он сортирует их по y

Ответы [ 3 ]

4 голосов
/ 02 августа 2011

Определите это сами:

sorted(list, key=lambda item: item[0][1])
# or whatever other sort of indexing you want

В вашем случае вы хотите индексировать:

sorted(list, key=lambda item: (item[1][0], item[1][1]))

, поскольку сравнение кортежей работает путем сравнения элементов попарно.key - это любой вызываемый объект, который преобразует элементы в вещь, которую можно сравнивать напрямую, чтобы получить желаемые результаты сравнения.

2 голосов
/ 02 августа 2011

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

>>> L=(0, (81.0, 5.0, 83.0)), (1, (81.0, 1.0, 26.0)), (2, (80.0, 1.0, 44.0)),
>>> sorted(L, key=lambda x:(x[1][0],x[1][1]))
[(2, (80.0, 1.0, 44.0)), (1, (81.0, 1.0, 26.0)), (0, (81.0, 5.0, 83.0))]

Поскольку порядок полей, по которым вы хотите отсортировать, совпадает с порядком в кортеже, вы можете упростить до этого

>>> sorted(L, key=lambda x:x[1])
[(2, (80.0, 1.0, 44.0)), (1, (81.0, 1.0, 26.0)), (0, (81.0, 5.0, 83.0))]

, который возвращает вас просто

>>> sorted(L, key=itemgetter(1))
[(2, (80.0, 1.0, 44.0)), (1, (81.0, 1.0, 26.0)), (0, (81.0, 5.0, 83.0))]

Но, надеюсь, теперь вы можете понять, почему эта делает сортировку элементов взаказ, который вы желаете

0 голосов
/ 02 августа 2011
>>> a = [23, [5, 6, 7]]
>>> a[1][0]
5

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...