descending - sorting dictionary by values python
파이썬에서 키별로 사전을 정렬하는 법 (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 %}
나는 다른 사람들이 이미 설명했던 것에 나의 것을 더할 것이다. 한 가지 구체적인 경우에 똑같은 문제가 발생했습니다. 안정적인 단위 테스트를 작성하기 위해 사전의 출력이 항상 동일해야했습니다.
우연히 달성하고자하는 것이거나 다른 출력 관련 작업 인 경우 아무것도 정리하지 않고 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}
정답은 사전의 항목을 정렬 된 순서로 원할 경우 사전 을 반복 할 때 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는 정렬에 신경 쓰지 않기 때문에 실제로 도움이되지 않습니다. 순서 를 추가하면됩니다.
다음은 키를 사용하여 사전을 정렬하는 데 사용할 수있는 빠르고 쉬운 함수입니다.
이 코드를 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 이상에서만 작동합니다.
건배,
- = 카메론