values - python sort dictionary descending



파이썬에서 키별로 사전을 정렬하는 법 (5)

Dicts에는 명령이 없습니다.

정렬 된 호출 할 수 있지만이 정렬 된 키 목록을 제공합니다.

>>> sorted(d)
['a', 'b', 'c', 'd']

이를 iterable로 취급하고 키 - 값 튜플을 정렬 할 수 있지만 튜플 목록 만 얻었습니다. 그것은 딕트와 같지 않습니다.

>>> sorted(d.items())
[
 ('a', [1, 2, 3]),
 ('b', ['blah', 'bhasdf', 'asdf']),
 ('c', ['one', 'two']),
 ('d', ['asdf', 'wer', 'asdf', 'zxcv'])
]

Python 2.7 이상을 사용하는 경우 OrderedDict 사용을 고려할 수도 있습니다.

추가 된 주문 항목을 기억하는 dict 하위 클래스

예 :

>>> d = collections.OrderedDict(sorted(d.items()))
>>> for k, v in d.items():
>>>     print k, v
a [1, 2, 3]
b ['blah', 'bhasdf', 'asdf']
c ['one', 'two']
d ['asdf', 'wer', 'asdf', 'zxcv']

아무도 내가 어떻게 정렬 할 수 말해 줄래?

{'a': [1, 2, 3], 'c': ['one', 'two'], 'b': ['blah', 'bhasdf', 'asdf'], 'd': ['asdf', 'wer', 'asdf', 'zxcv']}

으로

{'a': [1, 2, 3], 'b': ['blah', 'bhasdf', 'asdf'], 'c': ['one', 'two'],'d': ['asdf', 'wer', 'asdf', 'zxcv']}

? 감사!

업데이트 1, 코드 샘플 :

그래서 저는 언어학을하고 있습니다. 한 기사는 데이터베이스에 저장된 단어로 나뉘며 모든 ID와 문장 ID를 포함하는 모든 속성을 갖습니다. 작업 : 원본 텍스트를 다시 작성하는 중입니다.

DB에서 500 개의 연속 단어 가져 오기

words = Words.objects.all()[wordId:wordId+500]
# I first create paragraphs, through which I can loop later in my django template,
# and in each para will be a list of words (also dictionaries). 
# So i am trying to get a dictionary with values that are lists of dictionaries. 
# 'pp' i make just for shorthanding a long-named variable.
paras={}
para_high = para_low =  words[0].belongs_to_paragraph
for w in words:
    last_word = w
    pp = w.belongs_to_paragraph
    if pp >para_high:
        para_high = pp
    if pp < para_low:
        para_low = pp
    if pp in paras:
        paras[pp].append(w)
    else:
        list = [w]
        paras[pp] = list
# Since there are blank lines between paragraphs, in rebuilding the text as it 
    #  looked originally, I need to insert blank lines. 
    # Since i have the ID's of the paragraphs and they go somewhat like that: 1,3,4,8,9 
    #(the gaps between 1 & 3 and 4 & 8 i have to fill in with something else, 
    # which is why i had para_low and para_high to loop the range. 
isbr = True
for i in range(para_low, para_high+1):
    if i in paras:
        isbr = True
    else:
        if isbr:
            paras[i]=['break']
            isbr = False
        else:
            paras[i]=[]

그러나이 시점에서 내가 dict을 반복하고 텍스트를 다시 만들려고하면 이전에 작성한 단락보다 나중에 나오는 단락이 생겨서 그냥 그렇게하지 않습니다.

업데이트 2, 루프 코드 :

        {% for k,v in wording.iteritems()  %}
        {% if v[0] == 'break' %}
        <br/>
        {% else %}
        </div><div class="p">{% for word in v %}{% if word.special==0%} {% endif %}<span class="word {% if word.special == 0%}clickable{% endif%}" wid="{{word.id}}" special="{{word.special}}" somethingElse={{word.somethingElse}}>{{ word.word }}</span>{% endfor %}
        {% endif %}
    {% endfor %}

Answer #1

나는 다른 사람들이 이미 설명했던 것에 나의 것을 더할 것이다. 한 가지 구체적인 경우에 똑같은 문제가 발생했습니다. 안정적인 단위 테스트를 작성하기 위해 사전의 출력이 항상 동일해야했습니다.

우연히 달성하고자하는 것이거나 다른 출력 관련 작업 인 경우 아무것도 정리하지 않고 pprint 모듈 만 사용하면됩니다. 다른 기능 중에서도 키를 사용하여 사전을 정렬 할 수 있습니다.

>>> d = {'a':1, 'b':2, 'c':3}
>>> print d
{'a': 1, 'c': 3, 'b': 2}

>>> from pprint import pprint
>>> pprint(d)
{'a': 1, 'b': 2, 'c': 3}

Answer #2

또한 heapq에서 nlargest 루틴을 언급 가치가있을 수 있습니다. 그러면 상위 N 개 항목을 정렬하고 반환합니다. 실제로 필요한 것이 무엇인지에 따라 키 매개 변수로 재생할 때 유용 할 수 있습니다. 내가 밤 이틀 전에 그것을 발견했기 때문에 나는 이것을 주로 언급하고 그것은 내가 한 것입니다. PEP 0265Heapq 참조.


Answer #3

정답은 사전의 항목을 정렬 된 순서로 원할 경우 사전 을 반복 할 때 sorted () 함수를 사용해야한다는 것입니다.

for k, v in sorted(d.items()):
    print k, ':', v

또는

for k in sorted(d):
   print d[k]

또는 이와 유사합니다.

OrderedDict는 주문한 사전을 말합니다. 그리고 순서는 정렬과 동일하지 않습니다. 정렬 된 OrderedDict를 만들 수 있습니다. 그렇지만 새 키를 추가하자 마자 더 이상 정렬되지 않습니다. 따라서 sorted ()를 사용 하여 각 사용 전에 또는 각 조작 후에 정렬 할 필요가 있습니다 . 따라서 OrderedDict는 일반 사전보다 느리고 메모리 집약적 인 반면 필요한 것은 추가하지 않습니다.

OrderedDict는 정렬 된 사전이 아니지만 항목에 정렬이 아닌 일종의 정렬이있는 사전에 사용됩니다. 예를 들어, 추가 된 순서대로 항목을 표시하려는 경우 또는 사용자가 임의로 항목을 주문할 수있게하려는 경우.

업데이트 : 추가 설명

왜 OrderedDict는 해결책이 아닙니까? OrderedDict는 정렬 되지 않기 때문에 정렬 됩니다.

표준 사전을 고려하십시오.

>>> d = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5}

분류되지 않았습니다. 아래에서 보듯이 'c'는 'b'앞에옵니다. 또한 순서가 없습니다. 새 항목을 추가하면 무작위 순서처럼 보입니다.

>>> d['g'] = 6
>>> d['i'] = 8
>>> d
{'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3, 'g': 6, 'f': 5, 'i': 8}

좋습니다, 그럼 OrderedDict를 사용합시다 :

>>> o = OrderedDict(sorted({'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5}.items()))
>>> o
OrderedDict([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5)])

아하! 정렬되었습니다! 그래서 OrderedDict 작품!? 아니.

>>> o['i'] = 8
>>> o['g'] = 6
>>> o
OrderedDict([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('i', 8), ('g', 6)])

뭐? 결국 G는 내가 끝났어!?!? 왜!? OrderedDict는 정렬되지 않았으므로 주문되었습니다 . 그것은 당신이 물건을 추가하는 순서 를 기억합니다. 분류가 아닙니다. 즉, 사용할 때마다 먼저 정렬해야합니다. OrderedDict는 키를 추가하지 않는 한 정렬 된 상태로 유지됩니다. 그러나 수정하지 않으려는 경우에는 사전을 사용할 필요가 없습니다. 당신도 목록을 가질 수 있습니다. sorted ()에서 얻은 결과는 다음과 같습니다.

>>> sorted(o.items())
[('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('g', 6), ('i', 8)]

그러나 표준 사전과 마찬가지로 잘 작동하므로 OrderedDictionary가 도움이되지 않았습니다.

>>> sorted(d.items())
[('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('g', 6), ('i', 8)]

결론 사전 순으로 반복 할 때마다 정렬 된 방식으로 반복 할 때마다 다음을 수행해야합니다.

>>> for k in sorted(o):
...   print k, o[k]
... 
a 0
b 1
c 2
d 3
e 4
f 5
g 6
i 8

그리고 그것은 당신이 어떤 사전을 사용하든 상관 없습니다 . OrderedDict는 정렬에 신경 쓰지 않기 때문에 실제로 도움이되지 않습니다. 순서 를 추가하면됩니다.


Answer #4

다음은 키를 사용하여 사전을 정렬하는 데 사용할 수있는 빠르고 쉬운 함수입니다.

이 코드를 sdict.py 라는 별개의 파일에 넣으십시오.

def sortdict(dct):
    kys = dct.keys()
    kys.sort()
    from collections import OrderedDict
    d = OrderedDict()
    for x in kys: 
        for k, v in dct.iteritems():
            if (k == x):
                d[k] = v
    return d

이제이 코드를 test.py 라는 별도의 파일에 배치하여 샘플 사전으로 테스트합니다.

from sdict import sortdict
import json
dct = {'sizes':[32,28,42], 'dog':'schnauser', 'cat':'siamese', 'bird':'falcon'}
dctx = sortdict(dct)
print json.dumps(dctx) 

마지막으로 명령 행에서 test.py 를 호출하십시오.

$ python test.py
{"bird": "falcon", "cat": "siamese", "dog": "schnauser", "sizes": [32, 28, 42]}

json.dumps 줄만 사용하여 문자열 표현이 아닌 실제 사전임을 보여줍니다. 또한 해당 문제에 대해 type () 함수를 사용하여 테스트 할 수 있습니다.

샘플 사전에 숫자 값이 포함 된 중첩 목록을 포함하여 함수가 단일 레이어 문자열 기반 사전뿐만 아니라 더 복잡한 사전을 처리 할 수 ​​있음을 보여줍니다.

코드는 매우 직관적이어서 값을 기준으로 정렬하기 쉽게 수정할 수 있습니다. 사용자가 선호하는 경우 값을 기준으로 정렬하면 목록, 튜플 또는 기타 사전처럼 값이 일부인 경우 의미가 없습니다.

틀림없이 파이썬 2.7 이상에서만 작동합니다.

건배,
- = 카메론





dictionary