python - online - diccionarios para kali linux 2017
hacer diccionario con claves duplicadas en python (5)
¡No puedes tener un dict con claves duplicadas para la definición! Insistido en que puede utilizar una sola clave y, como valor, una lista de elementos que tenía esa clave.
Entonces puedes seguir esos pasos:
- Vea si la clave del elemento actual (de su conjunto inicial) está en el dict final. Si lo hace, vaya al paso 3
- Actualizar dict con clave
- Adjuntar a dict [clave] lista el nuevo valor
- Repita [1-3]
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 claves múltiples de números de registro de automóviles. Hasta ahora, cuando trato de convertir la lista al diccionario, elimina una de las claves. ¿Puede alguien mostrarme cómo hacer 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 intentado 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 manera fácil de lograr esto es mediante el uso de 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.
No puede tener claves duplicadas en un diccionario. ¿Qué tal un dict 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 cambiar el comportamiento de los tipos incorporados en python. Para su caso, es realmente fácil crear la subclase dict que almacenará los valores duplicados en listas bajo la misma clave de forma automática:
class Dictlist(dict):
def __setitem__(self, key, value):
try:
self[key]
except KeyError:
super(Dictlist, self).__setitem__(key, [])
self[key].append(value)
Ejemplo de salida:
>>> 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]}
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
Que almacenará el siguiente {''a'': 1, ''b'': [2, 3]}
.
Tiendo a utilizar 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
Que generará el mismo resultado que el anterior: {''a'': 1, ''b'': [2, 3]}
.
CAVEAT: esta implementación se basa en la inexistencia 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]}
.