source

순서부여된 기본 dict를 구현하는 방법

gigabyte 2023. 1. 22. 22:29
반응형

순서부여된 기본 dict를 구현하는 방법

I would like to combine 결합하고 싶다OrderedDict() ★★★★★★★★★★★★★★★★★」defaultdict()부에서collections in one object, which shall be an ordered, default 하나의 객체(명령된 객체여야 함)에서 기본dict.
이게 가능할까요?이게 가능합니까?

다음(이 레시피의 수정 버전을 사용)이 나에게는 유효합니다.

from collections import OrderedDict, Callable

class DefaultOrderedDict(OrderedDict):
    # Source: http://stackoverflow.com/a/6190500/562769
    def __init__(self, default_factory=None, *a, **kw):
        if (default_factory is not None and
           not isinstance(default_factory, Callable)):
            raise TypeError('first argument must be callable')
        OrderedDict.__init__(self, *a, **kw)
        self.default_factory = default_factory

    def __getitem__(self, key):
        try:
            return OrderedDict.__getitem__(self, key)
        except KeyError:
            return self.__missing__(key)

    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError(key)
        self[key] = value = self.default_factory()
        return value

    def __reduce__(self):
        if self.default_factory is None:
            args = tuple()
        else:
            args = self.default_factory,
        return type(self), args, None, None, self.items()

    def copy(self):
        return self.__copy__()

    def __copy__(self):
        return type(self)(self.default_factory, self)

    def __deepcopy__(self, memo):
        import copy
        return type(self)(self.default_factory,
                          copy.deepcopy(self.items()))

    def __repr__(self):
        return 'OrderedDefaultDict(%s, %s)' % (self.default_factory,
                                               OrderedDict.__repr__(self))

Python 2.7.X 및 3.4에서 테스트된 Raymond Hettinger의 슈퍼()에서 영감을 얻은 또 다른 가능성이 있습니다.X:

from collections import OrderedDict, defaultdict

class OrderedDefaultDict(OrderedDict, defaultdict):
    def __init__(self, default_factory=None, *args, **kwargs):
        #in python3 you can omit the args to super
        super(OrderedDefaultDict, self).__init__(*args, **kwargs)
        self.default_factory = default_factory

클래스 MRO(A)를 점검하면 업 MRO(MRO) 면) ifhelp(OrderedDefaultDict)), you'll see this:)는, 다음과 같이 표시됩니다.

class OrderedDefaultDict(collections.OrderedDict, collections.defaultdict)
 |  Method resolution order:
 |      OrderedDefaultDict
 |      collections.OrderedDict
 |      collections.defaultdict
 |      __builtin__.dict
 |      __builtin__.object

meaning that when an instance of 즉, 예를 들면OrderedDefaultDict is is the the the the the is 。OrderedDictinit이지만 에는 init을 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.defaultdict의 전)__builtin__.dict그게 바로 우리가 원하는 거야

클래스가 필요 없는 심플한 솔루션을 원하는 경우 또는 를 사용할 수 있습니다.루프 형식으로 몇 군데에서만 가져오거나 설정할 경우 기본값을 쉽게 설정할 수 있습니다.

totals = collections.OrderedDict()

for i, x in some_generator():
    totals[i] = totals.get(i, 0) + x

리스트는, 보다 간단하게 할 수 있습니다.setdefault:

agglomerate = collections.OrderedDict()

for i, x in some_generator():
    agglomerate.setdefault(i, []).append(x)

하지만 몇 번 이상 사용하는 경우에는 다른 답변과 같이 클래스를 설정하는 것이 좋습니다.

또 않다면요.사용 사례가 저처럼 단순하고 반드시 복잡함을 더하고 싶지 않다면DefaultOrderedDict클래스 실장을 고객의 코드에 맞추어 실시합니다.

from collections import OrderedDict

keys = ['a', 'b', 'c']
items = [(key, None) for key in keys]
od = OrderedDict(items)

)None원하는 기본값입니다.)

요구 사항 중 하나가 기본값으로 새 키를 동적으로 삽입하는 경우 이 솔루션은 작동하지 않습니다.단순성의 트레이드오프.

업데이트 3/13/17 - 이 사용 사례에 대한 편의 기능을 배웠습니다.위와 같으나 행을 생략할 수 있습니다.items = ...다음 중 하나:

od = OrderedDict.fromkeys(keys)

출력:

OrderedDict([('a', None), ('b', None), ('c', None)])

키가 한 글자일 경우 다음 문자열만 전달할 수 있습니다.

OrderedDict.fromkeys('abc')

이 출력은 위의 두 가지 예시와 동일합니다.

로서 디폴트값을 arg에 도 있습니다.OrderedDict.fromkeys(...).

하나의 하는 것입니다.get

>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d['key'] = d.get('key', 0) + 1
>>> d['key'] = d.get('key', 0) + 1
>>> d
OrderedDict([('key', 2)])
>>> 

@zeekay의 답변은 다음과 같습니다.

from collections import OrderedDict

class OrderedDefaultListDict(OrderedDict): #name according to default
    def __missing__(self, key):
        self[key] = value = [] #change to whatever default you want
        return value

@NickBread를 기반으로 한 심플하고 우아한 솔루션.공장 출하시 설정에는 약간 다른 API가 있습니다만, 항상 좋은 디폴트 설정을 할 수 있습니다.

class OrderedDefaultDict(OrderedDict):
    factory = list

    def __missing__(self, key):
        self[key] = value = self.factory()
        return value

이 스레드의 다른 답변에서 영감을 받아 다음과 같은 것을 사용할 수 있습니다.

from collections import OrderedDict

class OrderedDefaultDict(OrderedDict):
    def __missing__(self, key):
        value = OrderedDefaultDict()
        self[key] = value
        return value

누락된 메서드에서 같은 클래스의 다른 오브젝트를 초기화하면 단점이 있는지 알고 싶습니다.

기본 dict를 테스트해 보니 정렬도 되어 있더군요! 우연일 수도 있지만 어쨌든 정렬된 함수를 사용할 수 있습니다.

sorted(s.items())

그게 더 쉬울 것 같아

언급URL : https://stackoverflow.com/questions/6190331/how-to-implement-an-ordered-default-dict

반응형