Frage

In Python gibt es eine Möglichkeit, eine Klasse zu erstellen, die wie ein Wörterbuch behandelt wird, aber den Schlüssel vordefiniert, wenn eine neue Instanz erstellt wird?

War es hilfreich?

Lösung

Sie können ganz einfach jeden in Art gebaut erweitern. Dies ist, wie Sie es mit einem dict tun würden:

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

war ich nicht in der Lage, die Python-Dokumentation zu finden, die über das spricht, aber das sehr beliebte Buch Dive Into Python (kostenlos verfügbar online) hat ein paar Beispiele diese auf zu tun.

Andere Tipps

Sie können auch die dict Unterklasse die Schlüssel zu einer vordefinierten Liste beschränken, durch zwingende __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

Ja, in Python dict eine Klasse ist, so können Sie es Unterklasse:

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

Sie hier dict des __init__() Verfahren (ein Verfahren, das aufgerufen wird, wenn eine Instanz der Klasse erstellt wird) außer Kraft setzen. Innerhalb __init__ Sie ersten __init__() Methode Aufruf supercalss, die eine gängige Praxis ist, wenn Sie auf der Funktionalität der Basisklasse erweitern whant. Dann aktualisieren Sie die neue Instanz von SubDictionary mit Ihren ersten Daten.

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

Ich bin nicht sicher, ob dies ist, was Sie suchen, aber wenn ich Ihren Beitrag gelesen sofort Ich dachte, Sie waren auf der Suche, um dynamisch Schlüssel zum Zählen Übungen zu erzeugen.

Im Gegensatz zu Perl, was wird dies standardmäßig für Sie tun,


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

c   3
a   2
b   1

Python nicht geben Sie diese kostenlos:


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'

jedoch defaultdict wird dies für Sie tun,


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)

Erstellen Sie einfach eine Unterklasse von dict und fügen Sie die Tasten in der init Methode.

class MyClass(dict)

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

    self['key1'] = 'value1'

Denken Sie jedoch daran, dass in Python jede Klasse, die ‚wirkt wie ein dict‘ in der Regel wie ein behandelt wird, so dass Sie nicht zu viele Sorgen machen müssen, um eine Unterklasse zu sein, können Sie stattdessen die dict Methoden implementieren, obwohl die obiger Ansatz ist wahrscheinlich mehr nützlich für Sie.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top