[python] 주어진 인덱스의 요소별로 목록 / 튜플 목록 / 튜플을 정렬하는 방법은 무엇입니까?

다음과 같이 목록 목록이나 튜플 목록에 데이터가 있습니다.

data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]

그리고 하위 집합의 두 번째 요소별로 정렬하고 싶습니다. 2,5,8에 의해 정렬 의미 2에서이다 (1,2,3), 5에서이다 (4,5,6). 이 작업을 수행하는 일반적인 방법은 무엇입니까? 튜플 또는 목록을 내 목록에 저장해야합니까?



답변

sorted_by_second = sorted(data, key=lambda tup: tup[1])

또는:

data.sort(key=lambda tup: tup[1])  # sorts in place


답변

from operator import itemgetter
data.sort(key=itemgetter(1))


답변

위의 주석 이외의 다른 방법은 배열을이 행에 추가하는 것입니다.

reverse = True

결과는 다음과 같습니다.

data.sort(key=lambda tup: tup[1], reverse=True)


답변

예를 들어 튜플의 두 번째 및 세 번째 요소를 기준으로 여러 기준으로 정렬하려면

data = [(1,2,3),(1,2,1),(1,1,4)]

우선 순위를 설명하는 튜플을 반환하는 람다를 정의하십시오.

sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]


답변

Stephen의 대답 은 내가 사용하는 것입니다. 완성도를 높이기 위해 다음과 같은 목록 이해 기능이있는 DSU (장식-정렬-비 장식) 패턴이 있습니다.

decorated = [(tup[1], tup) for tup in data]
decorated.sort()
undecorated = [tup for second, tup in decorated]

또는 더 간결하게 :

[b for a,b in sorted((tup[1], tup) for tup in data)]

Python Sorting HowTo 에서 언급했듯이 , 주요 기능을 사용할 수있게 된 Python 2.4부터는 불필요합니다.


답변

튜플의리스트를 정렬하려면 (<word>, <count>)를 들어, count내림차순 및 word알파벳 순서 :

data = [
('betty', 1),
('bought', 1),
('a', 1),
('bit', 1),
('of', 1),
('butter', 2),
('but', 1),
('the', 1),
('was', 1),
('bitter', 1)]

이 방법을 사용합니다.

sorted(data, key=lambda tup:(-tup[1], tup[0]))

결과가 나옵니다.

[('butter', 2),
('a', 1),
('betty', 1),
('bit', 1),
('bitter', 1),
('bought', 1),
('but', 1),
('of', 1),
('the', 1),
('was', 1)]


답변

람다없이 :

def sec_elem(s):
    return s[1]

sorted(data, key=sec_elem)