순서부여된 기본 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 。OrderedDict
init이지만 에는 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
'source' 카테고리의 다른 글
MySQL/MARIADB에서 사용자 수준 잠금 강제 해제 (0) | 2023.01.22 |
---|---|
"집약 함수는 WHERE에서 허용되지 않습니다" 오류를 방지하는 방법 (0) | 2023.01.22 |
PHP를 사용하여 MySQL 데이터베이스에서 이미지를 저장 및 검색하려면 어떻게 해야 합니까? (0) | 2023.01.22 |
MariaDB : 데이터베이스를 만들고 명령줄 cmd에서 '<' 문자를 사용하지 않고 sql 스크립트를 실행합니다.실행 (0) | 2023.01.22 |
플레인 URL을 링크로 대체하려면 어떻게 해야 합니까? (0) | 2023.01.22 |