2011-09-05 11 views
8

Por ejemplo, yo llamo a esta función pasando un diccionario como parámetro:teclas invertido y los valores del diccionario original de

>>> inv_map({'a':1, 'b':2, 'c':3, 'd':2}) 
{1: ['a'], 2: ['b', 'd'], 3: ['c']} 
>>> inv_map({'a':3, 'b':3, 'c':3}) 
{3: ['a', 'c', 'b']} 
>>> inv_map({'a':2, 'b':1, 'c':2, 'd':1}) 
{1: ['b', 'd'], 2: ['a', 'c']} 

Si

map = { 'a': 1, 'b':2 } 

sólo puede invertir este mapa para llegar:

inv_map = { 1: 'a', 2: 'b' } 

mediante el uso de esta

dict((v,k) for k, v in map.iteritems()) 

¿Alguien sabe cómo hacer eso para mi caso?

Respuesta

13

Puede utilizar un defaultdict con la lista:

>>> from collections import defaultdict 
>>> m = {'a': 2, 'b': 1, 'c': 2, 'd': 1} 
>>> dd = defaultdict(list) 
>>> for k, v in m.iteritems(): 
...  dd[v].append(k) 
... 
>>> dict(dd) 
{1: ['b', 'd'], 2: ['a', 'c']} 

Si no importa si usted tiene un dict o defaultdict, se puede omitir el último paso und utilizar el defaultdict directamente.

+1

Tenga en cuenta que la última línea de conversión de la 'collections.defaultdict' de nuevo en una normal de' dict'- a menudo no es necesario o incluso indeseable. –

+0

@MikeGraham ¿Podría explicar por qué, por favor? A menudo hago más errores cuando no agrego esa línea (porque si busca una clave que no existe, la agregará). – tomasyany

8

Probablemente pueda usar defaultdict o setdefault aquí.

def invertDictionary(orig_dict): 
    result = {} # or change to defaultdict(list) 
    for k, v in orig_dict.iteritems(): 
     result.setdefault(v, []).append(k) 
2

EDITAR en Python 2.7:

from itertools import groupby 
def inv_map(d): 
    return {k : [i[0] for i in list(v)] for k, v in groupby(d.items(),lambda x:x[1])} 

print inv_map({'a':1, 'b':2, 'c':3, 'd':2}) 
print inv_map({'a':3, 'b':3, 'c':3}) 
print inv_map({'a':2, 'b':1, 'c':2, 'd':1}) 

de salida:

{1: ['a'], 2: ['b', 'd'], 3: ['c']} 
{3: ['a', 'c', 'b']} 
{1: ['b', 'd'], 2: ['a', 'c']} 
Cuestiones relacionadas