문제

Python 사전에서 삽입된 순서대로 항목을 검색할 수 있습니까?

도움이 되었습니까?

해결책

표준 파이썬 dict CPython 3.6+(또는 다른 Python 구현의 경우 Python 3.7+)를 사용하는 경우 기본적으로 이 작업을 수행합니다.

이전 버전의 Python에서는 다음을 사용할 수 있습니다. collections.OrderedDict.

다른 팁

다른 답변은 정확합니다.불가능하지만 직접 작성할 수도 있습니다.그러나 이와 같은 것을 실제로 구현하는 방법을 확신할 수 없는 경우를 대비해 제가 방금 작성하고 테스트한 하위 클래스 dict의 완전하고 작동하는 구현이 있습니다.(생성자에 전달된 값의 순서는 정의되지 않았지만 나중에 값이 전달되기 전에 오고 순서가 지정된 사전이 값으로 초기화되는 것을 항상 허용하지 않을 수 있습니다.)

class ordered_dict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        self._order = self.keys()

    def __setitem__(self, key, value):
        dict.__setitem__(self, key, value)
        if key in self._order:
            self._order.remove(key)
        self._order.append(key)

    def __delitem__(self, key):
        dict.__delitem__(self, key)
        self._order.remove(key)

    def order(self):
        return self._order[:]

    def ordered_items(self):
        return [(key,self[key]) for key in self._order]


od = ordered_dict()
od["hello"] = "world"
od["goodbye"] = "cruel world"
print od.order()            # prints ['hello', 'goodbye']

del od["hello"]
od["monty"] = "python"
print od.order()            # prints ['goodbye', 'monty']

od["hello"] = "kitty"
print od.order()            # prints ['goodbye', 'monty', 'hello']

print od.ordered_items()
# prints [('goodbye','cruel world'), ('monty','python'), ('hello','kitty')]

버전 2.7부터 사용 가능한 OrderedDict()를 사용하세요.

단지 호기심의 문제:

from collections import OrderedDict
a = {}
b = OrderedDict()
c = OredredDict()

a['key1'] = 'value1'
a['key2'] = 'value2'

b['key1'] = 'value1'
b['key2'] = 'value2'

c['key2'] = 'value2'
c['key1'] = 'value1'

print a == b #True
print a == c #True
print b == c #False

또는 튜플의 첫 번째 필드로 time.now()를 사용하여 키를 튜플로 만듭니다.

그런 다음 dictname.keys(), 정렬 및 짜잔을 사용하여 키를 검색할 수 있습니다!

독일 사람

Python 3.7부터 표준 dict는 삽입 순서를 유지합니다.로부터 문서:

버전 3.7에서 변경됨:사전 순서는 삽입 순서로 보장됩니다.이 동작은 3.6부터 CPython의 구현 세부 사항이었습니다.

따라서 사전을 정상적으로 반복하거나 다음을 사용할 수 있어야 합니다. popitem().

기본 dict 클래스로는 이 작업을 수행할 수 없습니다. 해시별로 정렬됩니다.실제로 키, 값 쌍 등의 목록인 자신만의 사전을 구축할 수 있습니다.

나는 이전에 StableDict를 성공적으로 사용해 본 적이 있습니다.

http://pypi.python.org/pypi/StableDict/0.2

또는 다음 구현 중 하나를 사용하십시오. PEP-372 설명 여기, 같은 odict 모듈 ~로부터 pythonutils.

pocoo.org 구현을 성공적으로 사용했습니다.

my_dict={}
my_dict["foo"]="bar"

~와 함께

my_dict=odict.odict()
my_dict["foo"]="bar"

그리고 그냥 요구 이 파일

나중에 참조할 수 있도록 별도의 목록에 키를 저장하지 않으면 불가능합니다.

당신이 할 수 있는 일은 입력된 순서를 나타내는 키로 값을 삽입한 다음 호출하는 것입니다. sorted() 항목에.

>>> obj = {}
>>> obj[1] = 'Bob'
>>> obj[2] = 'Sally'
>>> obj[3] = 'Joe'
>>> for k, v in sorted(obj.items()):
...     print v
... 
Bob
Sally
Joe
>>> 

dict 기능이 필요하지 않고 삽입한 순서대로 튜플만 반환하면 된다면 큐가 더 잘 작동하지 않을까요?

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