Как отсортировать список списков по определенному индексу внутреннего списка?


234

У меня есть список списков. Например,

[
[0,1,'f'],
[4,2,'t'],
[9,4,'afsd']
]

Если бы я хотел отсортировать внешний список по строковому полю внутренних списков, как бы вы это сделали в python?


6
Ссылка на учебное пособие: wiki.python.org/moin/HowTo/Sorting
Феликс Клинг

3
полезная ссылка: stackoverflow.com/questions/18142090/…
dot.Py

Ответы:


321

Это работа для itemgetter

>>> from operator import itemgetter
>>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> sorted(L, key=itemgetter(2))
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

Здесь также можно использовать лямбда-функцию, однако в этом простом случае лямбда-функция работает медленнее.


Что если я захочу проигнорировать дело?
bzupnick

5
@bzupnick, используй key=lambda x:x[2].casefold(). Если ваш Python недостаточно новый, просто используйте .lower()вместо него.casefold()
John La Rooy

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] С таким списком можно мы сортируем, используя itemgetter () относительно элементов в x [0] [1]?
nidHi

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

@quaryk Звучит как интересный вопрос, но не подходит для ответа в комментариях. Если вы не можете найти вопрос, который его охватывает, вы должны создать его.
Джон Ла Рой

175

на месте

>>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> l.sort(key=lambda x: x[2])

не на месте, используя сортировку:

>>> sorted(l, key=lambda x: x[2])

4
Не могли бы вы дать более подробную информацию о in placeи not in place?
Qun

9
@qun, «на месте» означает, что память старого списка повторно используется для отсортированного. «не на месте» означает, что старый список остается неизменным и создается новый список.
Джон Ла Рой

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] с таким списком: как мы можем отсортировать по элементам в x [0] [1]?
nidHi

81

Itemgetter позволяет сортировать по нескольким критериям / столбцам:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))

5
Я думаю, что этот ответ очень важен. Я думаю, что люди, пытающиеся сортировать по индексам внутреннего массива, упадут здесь, но люди, ищущие сортировку по индексам внутренних массивов MULTIPLE, начнут здесь, и ваш ответ помог мне увидеть, что itemgetter действительно сделает это за вас!
ZekeDroid

11

множественные критерии также могут быть реализованы с помощью лямбда-функции

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))

10
array.sort(key = lambda x:x[1])

Вы можете легко отсортировать, используя этот фрагмент, где 1 - индекс элемента.



8

Я думаю, что лямбда-функция может решить вашу проблему.

old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]

#let's assume we want to sort lists by last value ( old_list[2] )
new_list = sorted(old_list, key=lambda x: x[2])

#Resulst of new_list will be:

[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

2
**old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]
    #let's assume we want to sort lists by last value ( old_list[2] )
    new_list = sorted(old_list, key=lambda x: x[2])**

поправьте меня, если я ошибаюсь, но разве «x [2]» не вызывает третий элемент в списке, а не третий элемент во вложенном списке? это должно быть х [2] [2]?


Нет, потому что ключ / лямбда уже перебирает элементы списка первого уровня. x - локальная переменная, связанная с каждым элементом по очереди.
DragonLord

1

Более легко понять (что на самом деле делает Lambda):

ls2=[[0,1,'f'],[4,2,'t'],[9,4,'afsd']]
def thirdItem(ls):
    #return the third item of the list
    return ls[2]
#Sort according to what the thirdItem function return 
ls2.sort(key=thirdItem)

0

Сортировка многомерного массива выполнить здесь

arr=[[2,1],[1,2],[3,5],[4,5],[3,1],[5,2],[3,8],[1,9],[1,3]]



arr.sort(key=lambda x:x[0])
la=set([i[0] for i in Points])

for i in la:
    tempres=list()
    for j in arr:
        if j[0]==i:
            tempres.append(j[1])

    for j in sorted(tempres,reverse=True):
        print(i,j)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.