IT TIP

삽입 된 순서대로 사전에서 항목을 검색하는 방법은 무엇입니까?

itqueen 2020. 12. 15. 20:39
반응형

삽입 된 순서대로 사전에서 항목을 검색하는 방법은 무엇입니까?


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


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

이전 버전의 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

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

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

So, you should be able to iterate over the dictionary normally or use popitem().


Or, just make the key a tuple with time.now() as the first field in the tuple.

Then you can retrieve the keys with dictname.keys(), sort, and voila!

Gerry


You can't do this with the base dict class -- it's ordered by hash. You could build your own dictionary that is really a list of key,value pairs or somesuch, which would be ordered.


I've used StableDict before with good success.

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


Or use any of the implementations for the PEP-372 described here, like the odict module from the pythonutils.

I successfully used the pocoo.org implementation, it is as easy as replacing your

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

with

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

and require just this file


It's not possible unless you store the keys in a separate list for referencing later.


What you can do is insert the values with a key representing the order inputted, and then call sorted() on the items.

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

if you don't need the dict functionality, and only need to return tuples in the order you've inserted them, wouldn't a queue work better?

ReferenceURL : https://stackoverflow.com/questions/60848/how-do-you-retrieve-items-from-a-dictionary-in-the-order-that-theyre-inserted

반응형