source

특정 인덱스의 요소별로 목록/튜플을 정렬하려면 어떻게 해야 합니까?

lovecheck 2022. 10. 29. 10:03
반응형

특정 인덱스의 요소별로 목록/튜플을 정렬하려면 어떻게 해야 합니까?

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

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

기본 정렬 모드는 오름차순입니다.내림차순으로 정렬하려면 다음 옵션을 사용합니다.

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

또는 다음과 같이 입력합니다.

data.sort(key=lambda tup: tup[1], reverse=True)  # sorts in place
from operator import itemgetter
data.sort(key=itemgetter(1))

예를 들어, 태플의 두 번째 및 세 번째 요소를 기준으로 정렬할 경우,

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의 답변에 추가하고 싶을 뿐입니다.상기 코멘트 이외의 다른 방법은, 이것을 행에 추가하는 것입니다.

reverse = True

결과는 다음과 같습니다.

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

스티븐의 답변은 제가 쓰겠어요.완전성을 위해 리스트의 내용을 포함한 DSU(decorate-sort-undecorate) 패턴을 다음에 나타냅니다.

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)

itemgetter()보다 다소 빠르다lambda tup: tup[1]단, 증가율은 비교적 미미합니다(10~25% 정도).

(IPython 세션)

>>> from operator import itemgetter
>>> from numpy.random import randint
>>> values = randint(0, 9, 30000).reshape((10000,3))
>>> tpls = [tuple(values[i,:]) for i in range(len(values))]

>>> tpls[:5]    # display sample from list
[(1, 0, 0), 
 (8, 5, 5), 
 (5, 4, 0), 
 (5, 7, 7), 
 (4, 2, 1)]

>>> sorted(tpls[:5], key=itemgetter(1))    # example sort
[(1, 0, 0), 
 (4, 2, 1), 
 (5, 4, 0), 
 (8, 5, 5), 
 (5, 7, 7)]

>>> %timeit sorted(tpls, key=itemgetter(1))
100 loops, best of 3: 4.89 ms per loop

>>> %timeit sorted(tpls, key=lambda tup: tup[1])
100 loops, best of 3: 6.39 ms per loop

>>> %timeit sorted(tpls, key=(itemgetter(1,0)))
100 loops, best of 3: 16.1 ms per loop

>>> %timeit sorted(tpls, key=lambda tup: (tup[1], tup[0]))
100 loops, best of 3: 17.1 ms per loop

@Stephen의 대답은 딱 들어맞았다!여기 더 나은 시각화를 위한 예가 있습니다.

Ready Player One 팬들에게 외쳐주세요!=)

>>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')]
>>> gunters.sort(key=lambda tup: tup[0])
>>> print gunters
[('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')]

key는 비교를 위해 컬렉션의 항목을 변환하기 위해 호출되는 함수입니다.맘에 들다compareTomethod(Javava 。

키에 전달되는 파라미터는 호출 가능한 파라미터여야 합니다.여기에서는,lambda는, 어나니머스 함수(콜 가능)를 작성합니다.
lamda의 구문은 단어 lamda 뒤에 반복 가능한 이름이 있고 단일 코드 블록이 있습니다.

아래 예시는 특정 이벤트와 배우 이름의 정보를 담고 있는 튜플 목록을 정렬하고 있습니다.

이 목록을 이벤트 발생 시간(태플의 0번째 요소)별로 정렬합니다.

주의 -s.sort([cmp[, key[, reverse]]])

코드에 다음과 같이 사용합니다.

#To sort the list based on each element's second integer (elem[1])
sorted(d2, key=lambda elem: elem[1])

정렬할 요소에 따라 이 요소를 다음 위치에 배치할 수중에 넣을 수 있습니다.

(elem[*insert the index of the element you are sorting it by*])

태플 정렬은 매우 간단합니다.

tuple(sorted(t))

언급URL : https://stackoverflow.com/questions/3121979/how-to-sort-a-list-tuple-of-lists-tuples-by-the-element-at-a-given-index

반응형