다음과 같이 끝나는 기존 함수가 있습니다. 여기서 d
사전은 다음과 같습니다 .
return d.iteritems()
주어진 사전에 대해 분류되지 않은 반복자를 반환합니다. key 별로 정렬 된 항목을 통과하는 반복자를 반환하고 싶습니다 . 어떻게합니까?
답변
이것을 광범위하게 테스트하지는 않았지만 Python 2.5.2에서 작동합니다.
>>> d = {"x":2, "h":15, "a":2222}
>>> it = iter(sorted(d.iteritems()))
>>> it.next()
('a', 2222)
>>> it.next()
('h', 15)
>>> it.next()
('x', 2)
>>>
for key, value in d.iteritems(): ...
반복자 대신 수행하는 데 익숙한 경우 위의 솔루션에서 여전히 작동합니다.
>>> d = {"x":2, "h":15, "a":2222}
>>> for key, value in sorted(d.iteritems()):
>>> print(key, value)
('a', 2222)
('h', 15)
('x', 2)
>>>
Python 3.x에서는 반복자를 반환하는 d.items()
대신 사용하십시오 d.iteritems()
.
답변
sorted()
기능을 사용하십시오 :
return sorted(dict.iteritems())
정렬 된 결과에 대해 실제 반복자를 원하면 sorted()
목록을 리턴하므로 다음을 사용하십시오.
return iter(sorted(dict.iteritems()))
답변
dict의 키는 해시 테이블에 저장되므로 ‘자연 순서’, 즉 psuedo-random입니다. 다른 주문은 dict 소비자의 개념입니다.
sorted ()는 항상 dict가 아닌 목록을 반환합니다. dict.items ()를 전달하면 (튜플 목록을 생성 함) 루프에서 사용할 수있는 튜플 목록 [(k1, v1), (k2, v2), …]을 반환합니다. dict과 매우 흡사하지만 어쨌든 dict은 아닙니다 !
foo = {
'a': 1,
'b': 2,
'c': 3,
}
print foo
>>> {'a': 1, 'c': 3, 'b': 2}
print foo.items()
>>> [('a', 1), ('c', 3), ('b', 2)]
print sorted(foo.items())
>>> [('a', 1), ('b', 2), ('c', 3)]
다음은 루프에서 딕트처럼 느껴지지만 k, v로 압축이 풀린 튜플 목록입니다.
for k,v in sorted(foo.items()):
print k, v
대략 다음과 같습니다.
for k in sorted(foo.keys()):
print k, foo[k]
답변
그렉의 대답이 맞습니다. 파이썬 3.0에서는해야 할 것입니다
sorted(dict.items())
로 iteritems
사라질 것입니다.
답변
이제 OrderedDict
Python 2.7에서도 사용할 수 있습니다 .
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
여기 2.7 버전 의 새로운 기능 페이지와 OrderedDict API가 있습니다.
답변
일반적으로 다음과 같이 dict을 정렬 할 수 있습니다.
for k in sorted(d):
print k, d[k]
d.iteritems () 대신 “drop in replacement”가있는 특정 문제의 경우 다음과 같은 함수를 추가하십시오.
def sortdict(d, **opts):
# **opts so any currently supported sorted() options can be passed
for k in sorted(d, **opts):
yield k, d[k]
끝줄이
return dict.iteritems()
에
return sortdict(dict)
또는
return sortdict(dict, reverse = True)
답변
>>> import heapq
>>> d = {"c": 2, "b": 9, "a": 4, "d": 8}
>>> def iter_sorted(d):
keys = list(d)
heapq.heapify(keys) # Transforms to heap in O(N) time
while keys:
k = heapq.heappop(keys) # takes O(log n) time
yield (k, d[k])
>>> i = iter_sorted(d)
>>> for x in i:
print x
('a', 4)
('b', 9)
('c', 2)
('d', 8)
이 방법은 여전히 O (N log N) 정렬을 갖지만 짧은 선형 힙화 후에는 정렬 된 순서대로 항목을 생성하므로 항상 전체 목록이 필요하지 않을 때 이론적으로 더 효율적입니다.