¿Cómo crear un diccionario a partir de dos listas sin perder valores duplicados?

Tengo dos listas:

pin_list = ['in0', 'in1', 'in2', 'y'] delvt_list = ['0.399', '0.1995', '0.1995', '0.399'] 

Uso el código: temp = dict (zip (delvt_list, pin_list)) pero obtengo lo siguiente:

 temp = {'0.1995': 'in2', '0.399': 'y'} 

¿Qué código python necesito escribir para obtener:

  temp = {'0.1995': {'in2','in1'}, '0.399': {'y','in0'}} 

Edit: No he estado haciendo mucha encoding en Python, así que no estoy tan familiarizado con los conjuntos y probablemente necesito el formato de salida para ser:

 temp = {'0.1995': ['in2','in1'], '0.399': ['y','in0']} 

Como una pregunta adicional, si quiero usar los valores en temp para buscar una línea que estoy leyendo, ¿sería más fácil con conjuntos o matrices?

Utilice collections.defaultdict :

 temp = defaultdict(set) for delvt, pin in zip(delvt_list, pin_list): temp[delvt].add(pin) 

Esto crea una defaultdict defecto donde el valor predeterminado es un conjunto, luego haga un bucle y agregue los valores para cada clave.

Si en su lugar quería una lista, simplemente cambie el tipo predeterminado y cómo agrega valores para que coincidan con la interfaz de la list :

 temp = defaultdict(list) for delvt, pin in zip(delvt_list, pin_list): temp[delvt].append(pin) 

Los conjuntos son una mejor idea cuando quieres probar la membresía ( something in aset ); dichas pruebas llevan tiempo constante, en comparación con el tiempo lineal para una lista (por lo que las pruebas de pertenencia a un conjunto requieren una cantidad de tiempo fija independiente del tamaño del conjunto, mientras que para las listas lleva más tiempo, proporcional al número de elementos de la lista) .

puedes usar dict.setdefault() :

 In [20]: pin_list = ['in0', 'in1', 'in2', 'y'] In [21]: delvt_list = ['0.399', '0.1995', '0.1995', '0.399'] In [22]: dic={} In [23]: for x,y in zip(pin_list,delvt_list): dic.setdefault(y,[]).append(x) ....: In [24]: dic Out[24]: {'0.1995': ['in1', 'in2'], '0.399': ['in0', 'y']} 

o si quieres set salida basada:

 In [29]: dic={} In [30]: for x,y in zip(pin_list,delvt_list): dic.setdefault(y,set()).add(x) ....: In [31]: dic Out[31]: {'0.1995': set(['in1', 'in2']), '0.399': set(['y', 'in0'])} 

help() en dict.setdefault :

 D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D