두 번째 매개 변수를 기준으로 튜플 정렬


94

다음과 같은 튜플 목록이 있습니다.

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

내가 원하는 것은 튜플의 두 번째 값에 따라 오름차순으로 정렬 된 목록입니다. 따라서 L [0]은 ("Person 2", 8)정렬 후에 있어야합니다 .

어떻게 할 수 있습니까? Python 3.2.2 사용이 도움이된다면.


답변:


189

key매개 변수를 사용하여 다음을 수행 할 수 있습니다 list.sort().

my_list.sort(key=lambda x: x[1])

또는 약간 더 빠르게

my_list.sort(key=operator.itemgetter(1))

(다른 모듈과 마찬가지로 import operator사용할 수 있어야합니다.)


3
L.sort(key=operator.itemgetter(1))내 코드에서 사용 을 시도했지만 '연산자'가 정의되지 않은 NameError가 발생합니다. 특별한 것을 가져와야합니까?
user974703 dec.

3
약간의 검색을 했으므로 import operator기능을 사용해야합니다. 답변에 추가하면 수락으로 표시합니다.
user974703 dec.

timeit.timeit (기본 옵션)을 사용한 테스트는 다음 두 접근 방식간에 큰 차이가 없습니다. operator.itemgetter = 1.05µs, 람다 = 반복 당 1.25µs
Noel Evans

my_list.sort (key = operator.itemgetter (1)) 솔루션에 감사드립니다 !! :)
aman_novice

1
람다 키워드를 처음 사용하는 경우 : stackoverflow.com/questions/13669252/what-is-key-lambda
EchoLynx

12

그리고 python 3.X를 사용 sorted하는 경우 mylist에 함수를 적용 할 수 있습니다 . 이것은 @Sven Marnach가 위에서 제공 한 답변에 추가 된 것입니다.

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 

이것은 새 목록을 반환하는 내장 기능입니다. 귀하의 답변은 이미 여기에있는 것들에 아무것도 기여하지 않습니다. 새로운 목록을 원한다면 sorted대신 사용할 것이 분명하기 때문 입니다 list.sort.
miradulo

2
@SamuelNde식이 정렬에 대해 똑같이 작동하는지 확실하지 않아서 여기로 스크롤하여 도움이되었습니다.
Red Riding Hood

네 동의했습니다. 이것도 저를 도왔습니다
StackG

-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

출력-> Rogue One


몇 가지 생각 : 이것은 실제로 질문에 대답하지 않습니다 (튜플에서 값으로 정렬 된 목록을 얻는 방법). 루프에서 직접 튜플을 풀 수 있습니다 (영화의 경우 listoftuples : 값). 'tuple'유형을 재정의했습니다. 그리고 실제로 수행 할 수있는 것은 단일 목록 이해입니다. (return sorted ((value, movie) for movie, value in listoftuples) [-1] [1])
RFox

나는 당신이 원하는 것에 대해 감사하지만 우아함이 부족하고 개선 될 수 있다고 주장합니다. 일반적으로 이와 같이 튜플에서 요소의 순서를 변환하는 것은 좋지 않은 실행으로 간주됩니다. 목록 이해와 튜플 풀기에 대한 요점은 여전히 ​​존재할 것이라고 생각합니다. 그리고 나는이 방법론을 사용하는 사람이 받아 들여진 대답에 대해 낙담 할 것입니다.
RFox

나는 불가능이고 직장에 게시 코드, 대부분의 사용자 오류가 가져올 수 없습니다
데럴 화이트

그러나 조금 변경했으며 의심의 여지없이 귀하의 답변이 200 배 더 낫습니다.
Darrell White

def findMaxSales (listoftuples) : newlist = sorted ((value, movies) for movies, value in listoftuples) return newlist [-1] [1] movieList = [( "Finding Dory", 486), ( "Captain America : Civil War ", 408), ("Deadpool ", 363), ("Zootopia ", 341), ("Rogue One ", 529), ("The Secret Life of Pets ", 368), ("Batman v Superman ", 330 ), ( "Sing", 268), ( "Suicide Squad", 325), ( "The Jungle Book", 364)] print (findMaxSales (movieList))
Darrell White
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.