Hacer diccionario con claves duplicadas en python

Tengo la siguiente lista que contiene números de registro de automóviles duplicados con diferentes valores. Quiero convertirlo en un diccionario que acepte estas múltiples claves de los números de registro de automóviles. Hasta ahora, cuando bash convertir la lista al diccionario, se elimina una de las claves. Alguien me puede mostrar cómo hacer un diccionario con claves duplicadas La lista es:

EDF768, Bill Meyer, 2456, Vet_Parking TY5678, Jane Miller, 8987, AgHort_Parking GEF123, Jill Black, 3456, Creche_Parking ABC234, Fred Greenside, 2345, AgHort_Parking GH7682, Clara Hill, 7689, AgHort_Parking JU9807, Jacky Blair, 7867, Vet_Parking KLOI98, Martha Miller, 4563, Vet_Parking ADF645, Cloe Freckle, 6789, Vet_Parking DF7800, Jacko Frizzle, 4532, Creche_Parking WER546, Olga Grey, 9898, Creche_Parking HUY768, Wilbur Matty, 8912, Creche_Parking EDF768, Jenny Meyer, 9987, Vet_Parking TY5678, Jo King, 8987, AgHort_Parking JU9807, Mike Green, 3212, Vet_Parking 

El código que he probado es:

 data_dict = {} data_list = [] def createDictionaryModified(filename): path = "C:\Users\user\Desktop" basename = "ParkingData_Part3.txt" filename = path + "//" + basename file = open(filename) contents = file.read() print contents,"\n" data_list = [lines.split(",") for lines in contents.split("\n")] for line in data_list: regNumber = line[0] name = line[1] phoneExtn = line[2] carpark = line[3].strip() details = (name,phoneExtn,carpark) data_dict[regNumber] = details print data_dict,"\n" print data_dict.items(),"\n" print data_dict.values() 

Los diccionarios de Python no admiten claves duplicadas. Una forma de evitarlo es almacenar listas o conjuntos dentro del diccionario.

Una forma fácil de lograr esto es usando defaultdict :

 from collections import defaultdict data_dict = defaultdict(list) 

Todo lo que tienes que hacer es reemplazar.

 data_dict[regNumber] = details 

con

 data_dict[regNumber].append(details) 

y obtendrás un diccionario de listas.

Puede cambiar el comportamiento de los tipos incorporados en python. Para su caso, es realmente fácil crear una subclase de dict que almacenará valores duplicados en listas bajo la misma clave automáticamente:

 class Dictlist(dict): def __setitem__(self, key, value): try: self[key] except KeyError: super(Dictlist, self).__setitem__(key, []) self[key].append(value) 

Fuera poner ejemplo:

 >>> d = dictlist.Dictlist() >>> d['test'] = 1 >>> d['test'] = 2 >>> d['test'] = 3 >>> d {'test': [1, 2, 3]} >>> d['other'] = 100 >>> d {'test': [1, 2, 3], 'other': [100]} 

¡No puedes tener un dict con claves duplicadas para definición! Instado puede usar una sola clave y, como valor, una lista de elementos que tenía esa clave.

Así que puedes seguir esos pasos:

  1. Vea si la clave del elemento actual (de su conjunto inicial) está en el dictado final. Si lo hace, vaya al paso 3
  2. Actualizar dict con clave
  3. Anexar a dict [clave] listar el nuevo valor
  4. Repetir [1-3]

Si desea tener listas solo cuando son necesarias , y valores en cualquier otro caso, entonces puede HACER esto:

 class DictList(dict): def __setitem__(self, key, value): try: # Assumes there is a list on the key self[key].append(value) except KeyError: # if fails because there is no key super(DictList, self).__setitem__(key, value) except AttributeError: # if fails because it is not a list super(DictList, self).__setitem__(key, [self[key], value]) 

A continuación, puede hacer lo siguiente:

 dl = DictList() dl['a'] = 1 dl['b'] = 2 dl['b'] = 3 

Lo que almacenará lo siguiente {'a': 1, 'b': [2, 3]} .


Tiendo a usar esta implementación cuando quiero tener diccionarios inversos / inversos , en cuyo caso simplemente lo hago:

 my_dict = {1: 'a', 2: 'b', 3: 'b'} rev = DictList() for k, v in my_dict.items(): rev_med[v] = k 

Lo que generará la misma salida que arriba: {'a': 1, 'b': [2, 3]} .


CAVEAT: Esta implementación se basa en la no existencia del método de append (en los valores que está almacenando). Esto podría producir resultados inesperados si los valores que está almacenando son listas . Por ejemplo,

 dl = DictList() dl['a'] = 1 dl['b'] = [2] dl['b'] = 3 

produciría el mismo resultado que antes {'a': 1, 'b': [2, 3]} , pero uno podría esperar lo siguiente: {'a': 1, 'b': [[2], 3]} .

No puedes tener claves duplicadas en un diccionario. ¿Qué pasa con un dictado de listas?

 for line in data_list: regNumber = line[0] name = line[1] phoneExtn = line[2] carpark = line[3].strip() details = (name,phoneExtn,carpark) if not data_dict.has_key(regNumber): data_dict[regNumber] = [details] else: data_dict[regNumber].append(details) 

Puede consultar el siguiente artículo: http://www.wellho.net/mouth/3934_Multiple-identical-keys-in-a-Python-dict-yes-you-can-.html En dict, si key es un objeto , no hay problemas duplicados, por ejemplo:

 class p(object): def __init__(self, name): self.name = name def __repr__(self): return self.name def __str__(self): return self.name d = {p('k'): 1, p('k'): 2}