문제

내가 필요로 정렬하려면 다음과 같은 목록의 튜플 Python:

ListOfTuples = [('10', '2010 Jan 1;', 'Rapoport AM', 'Role of antiepileptic drugs as preventive agents for migraine', '20030417'), ('21', '2009 Nov;', 'Johannessen SI', 'Antiepilepticdrugs in epilepsy and other disorders--a population-based study of prescriptions', '19679449'),...]

내 목적은 그것을 주문하여 내림차순 년(listOfTuples[2])및 오름차순 저자(listOfTuples[2]):

sorted(result, key = lambda item: (item[1], item[2]))

하지만 그것은 작동하지 않습니다.는 어떻게 얻을 수 있습니종 안정성?

도움이 되었습니까?

해결책

def descyear_ascauth(atup):
  datestr = atup[1]
  authstr = atup[2]
  year = int(datestr.split(None, 1)[0])
  return -year, authstr

... sorted(result, key=descyear_ascauth) ...

Notes:추출하기 위해 필요한 올해 정수 지 않음(문자열로),할 수 있도록 변경 등록 --후자는 핵심 속을 만족시키기 위해서"내"사양.압박에서 lambda 는 것이 가능하지만,거기에 절대적으로 아무 이유 없이 그렇게 희생을 더 쉽도록할 때 def 단지뿐만 아니라 작동(고 훨씬 더 readably).

다른 팁

가장 쉬운 방법은 각 키 값을 별도로 정렬하는 것입니다.최소한의 열쇠에서 시작하여 가장 중요한 방식으로 일하십시오.

이 경우 :

import operator
ListOfTuples.sort(key=operator.itemgetter(2))
ListOfTuples.sort(key=lambda x: x[1][:4], reverse=True)
.

이 역방향 플래그를 사용하는 경우에도 파이썬의 정렬이 항상 안정적이기 때문에이 작품입니다. 즉, 역순으로 정렬 한 다음 반전 (안정성을 잃지 않아, 반전 후 안정성을 보존합니다.

물론 많은 키 열이있는 경우 이는 전체 정렬을 여러 번 수행 할 때 비효율적 일 수 있습니다.

당신이 원한다면 당신이 원한다면, 당신이 원한다면, 당신이 원한다면, 당신이 원한다면, 당신이 원한다면, 당신이 원한다면, 당신이 원한다면, 당신이 원한다면

여기에 모든 것을 위해 작동하는 관용구, 예를 들어 문자열과 같이 무효화 할 수없는 것입니다.

data = [ ('a', 'a'), ('a', 'b'), ('b','a') ]

def sort_func( a, b ):
    # compare tuples with the 2nd entry switched
    # this inverts the sorting on the 2nd entry
    return cmp( (a[0], b[1]), (b[0], a[1]) ) 

print sorted( data )                    # [('a', 'a'), ('a', 'b'), ('b', 'a')]
print sorted( data, cmp=sort_func )     # [('a', 'b'), ('a', 'a'), ('b', 'a')]
.

여기에 매월 약어와 일일 (발견 된 경우)을 고려한 대략적인 솔루션이 있습니다.

import time
import operator

def sortkey(seq):
    strdate, author = seq[1], seq[2]
    spdate = strdate[:-1].split()
    month = time.strptime(spdate[1], "%b").tm_mon
    date = [int(spdate[0]), month] + map(int, spdate[2:])
    return map(operator.neg, date), author  

print sorted(result, key=sortkey)
.

"% b"는 로켈의 축약 한 달 이름이며, 로케일을 처리하지 않으려는 경우 사전을 사용할 수 있습니다.

여기에는 람다 버전의 Alex의 답변이 있습니다.나는 그것이 지금 Duncan의 답변보다 더 컴팩트 한 것처럼 보이지만, 분명히 알렉스의 대답의 가독성이 잃어 버렸습니다.

sorted(ListOfTuples, key=lambda atup: (-int(atup[1].split(None, 1)[0]), atup[2]))
.

가독성 및 효율성은 일반적으로 소형화하는 것이 바람직합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top