Lista de valores para claves duplicadas en el diccionario Python

Le pido disculpas por adelantado si esta pregunta ya ha sido explorada aquí. Miré diferentes respuestas aquí pero no pude encontrar lo que necesito.

Mi objective es crear un diccionario como este: {'a':[10, 9, 10, 10], 'b':[10, 9, 1, 0], 'c':[0, 5, 0, 1], and so on}

Lo que tengo son varios diccionarios con claves duplicadas (las mismas claves en todos los otros diccionarios), algo como esto {'a':10, 'b': 0, 'c': 2} {'a':7, 'b': 4, 'c': 4} {'a':4, 'b': 5, 'c': 3}

No tengo forma de saber el número de dichos diccionarios, o si hay claves que continúan hasta ‘f’, o una ‘g’ en ellos, pero sé que las claves están duplicadas . He intentado defaultdict pero lo que obtengo es–

 defaultdict(, {'a': [10]}) defaultdict(, {'a': [10], 'b': [3]}) defaultdict(, {'a': [10], 'b': [3], 'c': [0]}) 

y luego lo mismo para el próximo diccionario –

 defaultdict(, {'a': [4]}) defaultdict(, {'a': [4], 'b': [5]}) defaultdict(, {'a': [4], 'b': [5], 'c': [1]}) 

El código que tengo para la salida anterior es –

 d = collections.defaultdict(list) for k, v in z.iteritems(): d[k].append(v) c = d.items() print d 

Si hago una print c lugar (para imprimir los d.items() ) obtengo –

 [('a', [10])] [('a', [10]), ('b', [3])] [('a', [10]), ('c', [0]), ('b', [3])] 

que se repite de nuevo para cada diccionario. ¿Cómo puedo obtener 1 dict con todas las claves, valores –

 {'a':[10,0,..], 'b':[4, 3, 4,..], etc.} ? 

También debo agregar que los dictados que tengo son el resultado de un bucle for y no se almacenan individualmente en una variable única.

Si entiendo correctamente su atención, está intentando fusionar varios diccionarios. Una forma de usar las numpy integradas (estoy seguro de que pronto alguien te dará una respuesta de numpy y collections ) podría tener este aspecto:

 ds = [ {'a':10, 'b': 0, 'c': 2}, {'a':7, 'b': 4, 'c': 4}, {'a':4, 'b': 5, 'c': 3} ] merged = {} for d in ds: for k, v in d.items (): if k not in merged: merged [k] = [] merged [k].append (v) print (merged) 

(Muy detallado para mayor claridad)

EDITAR: Después de haber leído su comentario que dice “El resultado que quiero es una lista de valores / clave”, puede usar esto en el diccionario combinado resultante:

 print ( [ (v, k) for k, v in merged.items () ] ) 

Esto produce:

 [([10, 7, 4], 'a'), ([2, 4, 3], 'c'), ([0, 4, 5], 'b')] 

¿Esto es lo que necesitas?

 in_dicts = [{'a':10, 'b': 0, 'c': 2}, {'a':7, 'b': 4, 'c': 4}, {'a':4, 'b': 5, 'c': 3}] out_dict = {} for in_d in in_dicts: for k, v in in_d.iteritems(): out_dict.setdefault(k, []).append(v) print out_dict 

{‘a’: [10, 7, 4], ‘c’: [2, 4, 3], ‘b’: [0, 4, 5]}

Aquí hay una forma de pensar acerca de esto:

Dado un diccionario en Python, puede acceder al value por dictionary[key] . En su caso, los valores de los diccionarios son listas.

Por lo tanto, puede crear una función para tomar una clave, ver si ya existe en su diccionario y, si es así, simplemente agregue el valor al diccionario. Por ejemplo:

Digamos que este es su diccionario actual:

 d = { 'a':[3, 17], 'b':[2, 4] } 

y tienes estos datos para analizar:

 data0 = { 'a':10, 'b':2, 'c':2 } 

Como la clave 'a' ya existe, desea tomar el valor de data0['a'] y adjuntar a d por d['a'].append(data0['a']) .

Déjame saber que esto ayuda / si necesitas alguna aclaración adicional!

  • mikeba

Otra forma de hacerlo es inicializar un dict y luego rellenarlo con claves únicas en todos los diccionarios y sus valores correspondientes sin sobrescribir los valores existentes. Pasos: 1. Inicialice un dict vacío (por ejemplo, key_values ) para almacenar los pares de valores clave clave 2. Iterar a través de la lista original de dictados 3. Cifras de rendimiento de uno en uno 4. Si no se ha agregado una key a los key_values , agregue la key y agregue su value a una lista; de lo contrario, agregue value al valor de la clave existente (que es una lista).

 list_of_dicts = [{'a':10, 'b': 0, 'c': 2}, {'a':7, 'b': 4, 'c': 4}, {'a':4, 'b': 5, 'c': 3}] key_values = {} for d in list_of_dicts: for k,v in d.iteritems(): if k in key_values.keys(): key_values[k].append(v) else: key_values[k]=[v] print key_values #prints out: {'a': [10, 7, 4], 'c': [2, 4, 3], 'b': [0, 4, 5]}