문제

Python에서는 사전처럼 취급되지만 새 인스턴스가 생성 될 때 키를 미리 정의한 클래스를 만들 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

내장 유형을 쉽게 확장 할 수 있습니다. 이것이 당신이 dict를 가지고 그것을하는 방법입니다.

>>> class MyClass(dict):
...     def __init__(self, *args, **kwargs):
...             self['mykey'] = 'myvalue'
...             self['mykey2'] = 'myvalue2'
...
>>> x = MyClass()
>>> x['mykey']
'myvalue'
>>> x
{'mykey2': 'myvalue2', 'mykey': 'myvalue'}

나는 이것에 대해 이야기하는 파이썬 문서를 찾을 수 없었지만 매우 인기있는 책 파이썬으로 뛰어 들었습니다 (무료 온라인 가능) 몇 가지 예가 있습니다 이 작업에.

다른 팁

Dict Subclass가 키를 사전 정의 된 목록으로 제한하도록 할 수도 있습니다. __setitem__()

>>> class LimitedDict(dict):
    _keys = "a b c".split()
    def __init__(self, valtype=int):
        for key in LimitedDict._keys:
            self[key] = valtype()
    def __setitem__(self, key, val):
        if key not in LimitedDict._keys:
            raise KeyError
        dict.__setitem__(self, key, val)


>>> limited = LimitedDict()
>>> limited['a']
0
>>> limited['a'] = 3
>>> limited['a']
3
>>> limited['z'] = 0

Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    limited['z'] = 0
  File "<pyshell#56>", line 8, in __setitem__
    raise KeyError
KeyError
>>> len(limited)
3

예, 파이썬에서 dict 수업이므로 서브 클래스를 할 수 있습니다.

    class SubDict(dict):
        def __init__(self):
            dict.__init__(self)
            self.update({
                'foo': 'bar',
                'baz': 'spam',})

여기에서 당신은 Dict 's를 무시합니다 __init__() 메소드 (클래스 인스턴스가 생성 될 때 호출되는 메소드). 내부에 __init__ 먼저 SuperCalss를 호출합니다 __init__() 기본 클래스의 기능을 확장 할 때 일반적인 관행입니다. 그런 다음 새 인스턴스를 업데이트합니다 SubDictionary 초기 데이터와 함께.

    subDict = SubDict()
    print subDict    # prints {'foo': 'bar', 'baz': 'spam'}

나는 이것이 당신이 찾고있는 것인지 확신하지 못하지만, 당신의 게시물을 읽을 때 즉시 운동을 계산하기위한 키를 동적으로 생성하려고한다고 생각했습니다.

기본적으로 귀하를 위해이 작업을 수행하는 Perl과 달리


grep{$_{$_}++} qw/ a a b c c c /;
print map{$_."\t".$_{$_}."\n"} sort {$_{$b}$_{$a}} keys %_;

c   3
a   2
b   1

파이썬은 무료로 제공하지 않습니다.


l = ["a","a","b","c","c","c"]
d = {}
for item in l:
    d[item] += 1

Traceback (most recent call last):
  File "./y.py", line 6, in 
    d[item] += 1
KeyError: 'a'

그러나 DefaultDict는 귀하를 위해이 작업을 수행합니다.


from collections import defaultdict
from operator import itemgetter

l = ["a","a","b","c","c","c"]
d = defaultdict(int)
for item in l:
    d[item] += 1

dl = sorted(d.items(),key=itemgetter(1), reverse=True)
for item in dl:
    print item

('c', 3)
('a', 2)
('b', 1)

Dict의 서브 클래스를 만들고 키를 추가하십시오. 이니 방법.

class MyClass(dict)

def __init__(self):
    """Creates a new dict with default values""""

    self['key1'] = 'value1'

그러나 Python에서 'Dict처럼 행동하는'클래스는 일반적으로 하나처럼 취급되므로 서브 클래스라는 것에 대해 너무 걱정할 필요가 없지만 위의 접근 방식은 대신 DITT 방법을 구현할 수 있습니다. 아마 당신에게 더 유용 할 것입니다 :).

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