Program Tip

주어진 인덱스에서 요소별로 목록 / 튜플을 정렬 (목록 / 튜플)하는 방법은 무엇입니까?

programtip 2020. 10. 3. 11:35
반응형

주어진 인덱스에서 요소별로 목록 / 튜플을 정렬 (목록 / 튜플)하는 방법은 무엇입니까?


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

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))

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

반응형