2011-04-16 13 views
5

En Python, es posible extender una lista de una manera perezosa utilizando itertools.chain:¿Hay una cadena para los mapas de Python?

L = itertools.chain(L1, L2) 

¿Hay un mapa perezoso "pegado" operador? Es decir,

M = glue(M1, M2) 

donde

M['blah'] 

vuelve

M1['blah'] if 'blah' in M1 else M2['blah'] 

y, M tiene generadores adecuados para keys() y values().

+1

Agregar colecciones.ChainMap como respuesta. Una clase estándar es mejor que un código personalizado. – IceArdor

Respuesta

5

Python 3.3 añade collections.ChainMap que hace exactamente eso.

+0

Hay un error ortográfico en el nombre del módulo (debe ser collection ** s **), ¿puede corregirlo? No puedo hacerlo yo mismo, porque la edición sería demasiado corta y aún no tengo más de 2000 de reputación. ¡Gracias! – plamut

+0

@plamut: hecho, gracias –

4

Es fácil construir una clase para representar evaluaciones diferidas en una lista de mapas, y adaptar el comportamiento a su aplicación. Por ejemplo:

from UserDict import DictMixin 

class Map(object, DictMixin): 
    def __init__(self, *maps): 
     self.maps = maps 
    def __getitem__(self, key): 
     for m in self.maps: 
      if key in m: 
       return m[key] 
    def keys(self): 
     return list(self.iterkeys()) 
    def iterkeys(self): 
     return (k for m in self.maps for k in m.iterkeys()) 
    def values(self): 
     return list(self.itervalues()) 
    def itervalues(self): 
     return (v for m in self.maps for v in m.itervalues()) 

def glue(*maps): 
    return Map(*maps) 

M1 = {'blah': 1} 
M2 = {'duh': 2} 

M = glue(M1, M2) 
print M['blah'] 
print M['duh'] 
print list(M.keys()) 
print list(M.values()) 

Salida:

1 
2 
['blah', 'duh'] 
[1, 2] 
+0

¿Necesitas mencionar explícitamente 'object' allí? ¿'DictMixin' ya no hereda' object'? –

+2

Al menos a través de Python 2.7 UserDict.DictMixin es una clase de estilo antiguo. – samplebias

+0

No estaba al tanto de eso. Gracias. –

Cuestiones relacionadas