Pregunta

En Python, ¿hay una manera de crear una clase que se trate como un diccionario pero que tenga las claves predefinidas cuando se crea una nueva instancia?

¿Fue útil?

Solución

Usted puede extender fácilmente cualquier tipo incorporado. Así es como lo harías con un dictado:

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

No pude encontrar la documentación de Python que habla de esto, pero el muy popular libro Dive Into Python (disponible gratis en línea) tiene algunos ejemplos para hacer esto.

Otros consejos

También puede hacer que la subclase dict restrinja las claves a una lista predefinida, anulando __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í, en Python dict es una clase, así que puedes crear una subclase:

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

Aquí usted reemplaza el método __init __ () de dict (un método que se llama cuando se crea una instancia de la clase). Dentro de __init__ , primero llama a los supercalss __init __ () , que es una práctica común cuando desea ampliar la funcionalidad de la clase base. Luego actualiza la nueva instancia de SubDictionary con sus datos iniciales.

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

No estoy seguro de que esto sea lo que estás buscando, pero cuando leí tu publicación, inmediatamente pensé que estabas buscando generar dinámicamente las claves para los ejercicios de conteo.

A diferencia de perl, que lo hará por usted de forma predeterminada,


grep{

No estoy seguro de que esto sea lo que estás buscando, pero cuando leí tu publicación, inmediatamente pensé que estabas buscando generar dinámicamente las claves para los ejercicios de conteo.

A diferencia de perl, que lo hará por usted de forma predeterminada,


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 no te dará esto gratis:


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)

sin embargo, defaultdict lo hará por usted,

<*>{

No estoy seguro de que esto sea lo que estás buscando, pero cuando leí tu publicación, inmediatamente pensé que estabas buscando generar dinámicamente las claves para los ejercicios de conteo.

A diferencia de perl, que lo hará por usted de forma predeterminada,

<*>

Python no te dará esto gratis:

<*>

sin embargo, defaultdict lo hará por usted,

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

No estoy seguro de que esto sea lo que estás buscando, pero cuando leí tu publicación, inmediatamente pensé que estabas buscando generar dinámicamente las claves para los ejercicios de conteo.

A diferencia de perl, que lo hará por usted de forma predeterminada,

<*>

Python no te dará esto gratis:

<*>

sin embargo, defaultdict lo hará por usted,

<*>."\t".

No estoy seguro de que esto sea lo que estás buscando, pero cuando leí tu publicación, inmediatamente pensé que estabas buscando generar dinámicamente las claves para los ejercicios de conteo.

A diferencia de perl, que lo hará por usted de forma predeterminada,

<*>

Python no te dará esto gratis:

<*>

sin embargo, defaultdict lo hará por usted,

<*>{

No estoy seguro de que esto sea lo que estás buscando, pero cuando leí tu publicación, inmediatamente pensé que estabas buscando generar dinámicamente las claves para los ejercicios de conteo.

A diferencia de perl, que lo hará por usted de forma predeterminada,

<*>

Python no te dará esto gratis:

<*>

sin embargo, defaultdict lo hará por usted,

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

No estoy seguro de que esto sea lo que estás buscando, pero cuando leí tu publicación, inmediatamente pensé que estabas buscando generar dinámicamente las claves para los ejercicios de conteo.

A diferencia de perl, que lo hará por usted de forma predeterminada,

<*>

Python no te dará esto gratis:

<*>

sin embargo, defaultdict lo hará por usted,

<*>{$b}

No estoy seguro de que esto sea lo que estás buscando, pero cuando leí tu publicación, inmediatamente pensé que estabas buscando generar dinámicamente las claves para los ejercicios de conteo.

A diferencia de perl, que lo hará por usted de forma predeterminada,

<*>

Python no te dará esto gratis:

<*>

sin embargo, defaultdict lo hará por usted,

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

Python no te dará esto gratis:

<*>

sin embargo, defaultdict lo hará por usted,

<*>

Simplemente crea una subclase de dict y agrega las claves en el método init .

class MyClass(dict)

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

    self['key1'] = 'value1'

Recuerde, sin embargo, que en python cualquier clase que 'actúe como un dict' generalmente se trata como una, por lo que no tiene que preocuparse demasiado por ser una subclase, sino que podría implementar los métodos dict, aunque El enfoque anterior es probablemente más útil para usted :).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top