내부 목록의 특정 색인을 기준으로 목록 목록을 정렬하는 방법은 무엇입니까?


답변:


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(). 파이썬이 충분히 새롭지 않다면, .lower()대신 사용하십시오.casefold()
John La Rooy

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] 이와 같은 목록으로 x [0] [1]의 요소와 관련하여 itemgetter ()를 사용하여 정렬합니다.
nidHi

정렬 목록을 가져 와서 다른 관련 목록 목록을 동일한 순서로 정렬 할 수 있습니까?
쿼키

@quaryk 그것은 흥미로운 질문처럼 들리지만 의견에 대답하기에는 적합하지 않습니다. 다루는 질문을 찾을 수 없으면 질문을 만들어야합니다.
존 라 Rooy

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 placenot in place?
qun

9
@qun, "in place"는 이전 목록의 메모리가 정렬 된 목록에 재사용됨을 의미합니다. "제자리에 없음"은 이전 목록이 변경되지 않고 새 목록이 작성됨을 의미합니다.
John La Rooy

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

이처럼 :

import operator
l = [...]
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index))

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]'가 아닌 경우 수정하십시오. x [2] [2] 여야합니까?


키 / 람다가 이미 1 단계 목록의 항목을 반복하고 있기 때문에 아니요. 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.