주어진 인덱스에서 요소별로 목록 / 튜플을 정렬 (목록 / 튜플)하는 방법은 무엇입니까?
다음과 같이 목록 목록 또는 튜플 목록에 데이터가 있습니다.
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))
배열을 높음에서 낮음으로 정렬하려면 Stephen의 대답에 추가하고 싶습니다. 위의 주석 이외의 다른 방법은 이것을 줄에 추가하는 것입니다.
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 (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)]
람다없이 :
정의 sec_elem (s) : s [1] 반환
sorted (데이터, 키 = 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의 대답은 요점입니다! 다음은 더 나은 시각화를위한 예입니다.
Shout out for the Ready Player One fans! =)
>>> 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
is a function that will be called to transform the collection's items for comparison.. like compareTo
method in Java.
The parameter passed to key must be something that is callable. Here, the use of lambda
creates an anonymous function (which is a callable).
The syntax of lambda is the word lambda followed by a iterable name then a single block of code.
Below example, we are sorting a list of tuple that holds the info abt time of certain event and actor name.
We are sorting this list by time of event occurrence - which is the 0th element of a tuple.
Note - s.sort([cmp[, key[, reverse]]])
sorts the items of s in place
Sorting a tuple is quite simple:
tuple(sorted(t))
'Program Tip' 카테고리의 다른 글
Bash의 'if'문에서 두 문자열 변수를 어떻게 비교합니까? (0) | 2020.10.03 |
---|---|
Java의 foreach 루프에서 제거 호출 (0) | 2020.10.03 |
왜 this ()와 super ()가 생성자의 첫 번째 문장이어야합니까? (0) | 2020.10.03 |
Java에서 getPath (), getAbsolutePath () 및 getCanonicalPath ()의 차이점은 무엇입니까? (0) | 2020.10.03 |
git [duplicate]에서 단일 파일을 이전 버전으로 되돌리기 (0) | 2020.10.03 |