Domanda

In Python, c'è un modo per creare una classe trattata come un dizionario ma con le chiavi predefinite quando viene creata una nuova istanza?

È stato utile?

Soluzione

Puoi facilmente estendere qualsiasi tipo incorporato. Ecco come lo faresti con un 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'}

Non sono riuscito a trovare la documentazione di Python che ne parla, ma il libro molto popolare Dive Into Python (disponibile gratuitamente online) ha alcuni esempi su come farlo.

Altri suggerimenti

Puoi anche fare in modo che la sottoclasse dict limiti le chiavi a un elenco predefinito, sovrascrivendo __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

Sì, in Python dict è una classe, quindi puoi sottoclassarla:

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

Qui sostituisci il metodo __init __ () di dict (un metodo che viene chiamato quando viene creata un'istanza della classe). All'interno di __init__ per prima cosa si chiama il metodo __init __ () di supercals, che è una pratica comune quando si desidera espandere la funzionalità della classe base. Quindi aggiorni la nuova istanza di SubDictionary con i tuoi dati iniziali.

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

Non sono sicuro che questo sia quello che stai cercando, ma quando ho letto il tuo post ho pensato immediatamente che stavi cercando di generare dinamicamente le chiavi per gli esercizi di conteggio.

A differenza di perl, che lo farà per impostazione predefinita,


grep{

Non sono sicuro che questo sia quello che stai cercando, ma quando ho letto il tuo post ho pensato immediatamente che stavi cercando di generare dinamicamente le chiavi per gli esercizi di conteggio.

A differenza di perl, che lo farà per impostazione predefinita,


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'

Python non ti darà questo gratuitamente:


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)

tuttavia, defaultdict lo farà per te,

<*>{

Non sono sicuro che questo sia quello che stai cercando, ma quando ho letto il tuo post ho pensato immediatamente che stavi cercando di generare dinamicamente le chiavi per gli esercizi di conteggio.

A differenza di perl, che lo farà per impostazione predefinita,

<*>

Python non ti darà questo gratuitamente:

<*>

tuttavia, defaultdict lo farà per te,

<*>}++} qw/ a a b c c c /; print map{

Non sono sicuro che questo sia quello che stai cercando, ma quando ho letto il tuo post ho pensato immediatamente che stavi cercando di generare dinamicamente le chiavi per gli esercizi di conteggio.

A differenza di perl, che lo farà per impostazione predefinita,

<*>

Python non ti darà questo gratuitamente:

<*>

tuttavia, defaultdict lo farà per te,

<*>."\t".

Non sono sicuro che questo sia quello che stai cercando, ma quando ho letto il tuo post ho pensato immediatamente che stavi cercando di generare dinamicamente le chiavi per gli esercizi di conteggio.

A differenza di perl, che lo farà per impostazione predefinita,

<*>

Python non ti darà questo gratuitamente:

<*>

tuttavia, defaultdict lo farà per te,

<*>{

Non sono sicuro che questo sia quello che stai cercando, ma quando ho letto il tuo post ho pensato immediatamente che stavi cercando di generare dinamicamente le chiavi per gli esercizi di conteggio.

A differenza di perl, che lo farà per impostazione predefinita,

<*>

Python non ti darà questo gratuitamente:

<*>

tuttavia, defaultdict lo farà per te,

<*>}."\n"} sort {

Non sono sicuro che questo sia quello che stai cercando, ma quando ho letto il tuo post ho pensato immediatamente che stavi cercando di generare dinamicamente le chiavi per gli esercizi di conteggio.

A differenza di perl, che lo farà per impostazione predefinita,

<*>

Python non ti darà questo gratuitamente:

<*>

tuttavia, defaultdict lo farà per te,

<*>{$b}

Non sono sicuro che questo sia quello che stai cercando, ma quando ho letto il tuo post ho pensato immediatamente che stavi cercando di generare dinamicamente le chiavi per gli esercizi di conteggio.

A differenza di perl, che lo farà per impostazione predefinita,

<*>

Python non ti darà questo gratuitamente:

<*>

tuttavia, defaultdict lo farà per te,

<*>{$a}} keys %_; c 3 a 2 b 1

Python non ti darà questo gratuitamente:

<*>

tuttavia, defaultdict lo farà per te,

<*>

Basta creare una sottoclasse di dict e aggiungere le chiavi nel metodo init .

class MyClass(dict)

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

    self['key1'] = 'value1'

Ricorda, tuttavia, che in Python qualsiasi classe che "agisce come un dict" viene generalmente trattata come una, quindi non devi preoccuparti troppo che sia una sottoclasse, ma potresti invece implementare i metodi dict, sebbene il l'approccio sopra è probabilmente più utile per te :).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top