Як сортувати список списків за конкретним індексом внутрішнього списку?


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
Я думаю, що ця відповідь дуже важлива. Я думаю, що люди, які намагаються сортувати за внутрішніми індексами масиву, потраплять сюди, але люди, які хочуть сортувати за МНОГО ВНУТРІШНІМ індексом масиву, почнуться тут, і ваша відповідь допомогла мені побачити, що 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]' називає 3-й елемент у списку, а не 3-й елемент у вкладеному списку? чи має бути х [2] [2]?


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

1

Більш просто зрозуміти (що насправді робить Лямбда):

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.