>

reverse=True 를 사용하여 사전을 먼저 정렬해야합니다. , 반복되는 값의 경우 키를 기준으로 정렬 ( reverse=False )

지금까지 나는 이것을 가지고있다

dict = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
sorted(dict.items(), key=lambda x: (x[1],x[1]), reverse=True)

이것은 ...

[('B', 3), ('A', 2), ('J', 1), ('I', 1), ('A', 1)]

하지만 필요합니다 :

[('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]

보시다시피, 값이 같으면 지정된대로 감소하는 방식으로 만 키를 정렬 할 수 있습니다. 그러나 어떻게 증가하는 방식으로 키를 정렬 할 수 있습니까?


  • 답변 # 1

    다음은 입력과 함께 작동합니다 :

    d = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
    sorted(d,key=lambda x:(-x[1],x[0]))
    
    

    '값'이 숫자이므로 부호를 변경하여 정렬 순서를 쉽게 바꿀 수 있습니다.

    다시 말해,이 정렬은 사물을 가치별로 정렬합니다 ( -x[1] ) (음수 부호는 큰 숫자를 먼저 표시)와 같은 숫자의 경우 키 ( x[0] )에 따라 주문 ).

    큰 항목을 먼저 배치하기 위해 값을 쉽게 "부정 화"할 수없는 경우 쉬운 해결 방법은 두 번 정렬하는 것입니다.

    from operator import itemgetter
    d.sort(key=itemgetter(0))
    d.sort(key=itemgetter(1),reverse=True)
    
    

    파이썬의 정렬이 안정적이기 때문에 작동합니다.

  • 답변 # 2

    In [4]: l = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
    In [5]: sorted(l, key=lambda (x,y):(-y,x))
    Out[5]: [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
    
    

  • 답변 # 3

    collections.defaultdict 를 사용할 수 있습니다 :

    In [48]: from collections import defaultdict
    In [49]: dic=[('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
    In [50]: d=defaultdict(list)
    In [51]: for x,y in dic:
        d[y].append(x)
        d[y].sort()          #sort the list
    
    

    지금 d  다음과 같습니다.

    defaultdict(<type 'list'>, {1: ['A', 'I', 'J'], 2: ['A'], 3: ['B']}
    
    

    즉 새로운 dict   1,2,3... 와 함께  값으로 목록에 저장된 키 및 해당 알파벳으로.

    이제 sorted(d.items) 를 반복 할 수 있습니다   itertools.chain() 를 사용하여 원하는 결과를 얻습니다.  그리고 itertools.product() .

    In [65]: l=[ product(y,[x]) for x,y in sorted(d.items(),reverse=True)]
    In [66]: list(chain(*l))
    Out[66]: [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
    
    

  • 이전 winforms - 여러 파일 열기 (OpenFileDialog, C #)
  • 다음 Vim에서 현재 파일의 이름을 얻습니다