Python equivalente de zip para diccionarios

Si tengo estas dos listas:

la = [1, 2, 3] lb = [4, 5, 6] 

Puedo recorrerlos de la siguiente manera:

 for i in range(min(len(la), len(lb))): print la[i], lb[i] 

O más pythonicamente.

 for a, b in zip(la, lb): print a, b 

¿Qué pasa si tengo dos diccionarios?

 da = {'a': 1, 'b': 2, 'c': 3} db = {'a': 4, 'b': 5, 'c': 6} 

De nuevo, puedo iterar manualmente:

     for key in set(da.keys()) & set(db.keys()): print key, da[key], db[key] 

    ¿Hay algún método incorporado que me permita iterar de la siguiente manera?

     for key, value_a, value_b in common_entries(da, db): print key, value_a, value_b 

    No hay una función o método incorporado que pueda hacer esto. Sin embargo, usted podría definir fácilmente su propio.

     def common_entries(*dcts): for i in set(dcts[0]).intersection(*dcts[1:]): yield (i,) + tuple(d[i] for d in dcts) 

    Esto se basa en el “método manual” que proporciona, pero, como zip , puede usarse para cualquier número de diccionarios.

     >>> da = {'a': 1, 'b': 2, 'c': 3} >>> db = {'a': 4, 'b': 5, 'c': 6} >>> list(common_entries(da, db)) [('c', 3, 6), ('b', 2, 5), ('a', 1, 4)] 

    Cuando solo se proporciona un diccionario como argumento, esencialmente devuelve dct.items() .

     >>> list(common_entries(da)) [('c', 3), ('b', 2), ('a', 1)] 

    Es posible que desee hacer una intersección, utilizando el tipo de conjunto de Python.

     da = {'a': 1, 'b': 2, 'c': 3, 'e': 7} db = {'a': 4, 'b': 5, 'c': 6, 'd': 9} dc = set(da) & set(db) for i in dc: print i,da[i],db[i] 

    Aclamaciones,

    K.

    Las vistas clave del diccionario ya están configuradas como en Python 3. Puedes eliminar set() :

     for key in da.keys() & db.keys(): print(key, da[key], db[key]) 

    En Python 2:

     for key in da.viewkeys() & db.viewkeys(): print key, da[key], db[key] 

    En caso de que si alguien está buscando una solución generalizada:

     import operator from functools import reduce def zip_mappings(*mappings): keys_sets = map(set, mappings) common_keys = reduce(set.intersection, keys_sets) for key in common_keys: yield (key,) + tuple(map(operator.itemgetter(key), mappings)) 

    o si te gusta separar la clave de los valores y usar la syntax como

     for key, (values, ...) in zip_mappings(...): ... 

    podemos reemplazar la última línea con

     yield key, tuple(map(operator.itemgetter(key), mappings)) 

    Pruebas

     from collections import Counter counter = Counter('abra') other_counter = Counter('kadabra') last_counter = Counter('abbreviation') for (character, frequency, other_frequency, last_frequency) in zip_mappings(counter, other_counter, last_counter): print('character "{}" has next frequencies: {}, {}, {}' .format(character, frequency, other_frequency, last_frequency)) 

    Nos da

     character "a" has next frequencies: 2, 3, 2 character "r" has next frequencies: 1, 1, 1 character "b" has next frequencies: 1, 1, 2 

    (probado en Python 2.7.12 y Python 3.5.2 )