2011-12-27 17 views
5

tengo este diccionario en Pythonobtienen claves corresponden a un valor en el diccionario de

d={1: 'a', 2: 'b', 3: 'c'} 

con d [1] consigo

>>> d[1] 
'a' 

cómo puedo obtener la clave corresponden a un valor?
ejemplo: con 'a' get 1

+3

Quiere invertir la asignación. Esta pregunta responde que: http://stackoverflow.com/questions/483666/python-reverse-inverse-a-mapping –

+1

@JonathonReinhart No estoy seguro de que quiera invertir el mapeo. Creo que la pregunta es acerca de obtener * 1 clave * de un valor, y probablemente hay alguna manera de hacerlo más rápido – FunkySayu

+0

@JonathonReinhart bien, de hecho, no estoy seguro: en el título tenemos "claves" y en el pregunta que tenemos "la clave" ... – FunkySayu

Respuesta

5

desea invertir el mapeo:

Como se muestra en this question

dict((v,k) for k, v in map.iteritems()) 
+2

¿Esto no nukea algunos de sus datos en el nuevo dict si tiene varios elementos con el mismo valor? – Interrobang

+2

@Interrobang que es inevitable; si hay varios elementos con el mismo valor, entonces, de todos modos, es ambiguo qué tecla devolver para un valor determinado. –

+0

Puede crear una lista para cada valor ... – kindall

3

Se puede crear un nuevo diccionario de las claves y valores en la inicial:

>>> d2 = dict((v, k) for k, v in d.iteritems()) 
>>> d2 
{'a': 1, 'c': 3, 'b': 2} 
>>> d2['a'] 
1 
2
key = 'a' 
return [item[0] for item in self.items() if item[1] == key] 

Este wi Encontraré todas las claves con el valor 'a' y devolveré una lista de ellas.

+0

Tenga en cuenta que esto no es tan eficiente (asintéticamente) como la búsqueda por clave. Si necesita hacer esto varias veces en dictados de tamaño considerable, el otro enfoque puede ser mucho más eficiente. – delnan

3

En el caso de que esté buscando obtener solo un valor, probablemente exista una forma más rápida de hacerlo. Si está seguro de que el valor existe en su dictionnary, entonces:

my_value = 'a' 
return next(key for key, value in d.iteritems() if value == my_value) 

Si no está seguro de conseguir un resultado, puede que la rodean por un try/excepto agarrar la excepción StopIteration.

Aquí, los elementos de dictionnary se generan hasta que el valor coincida. Si tiene un dictionario muy grande, este truco puede ser más rápido en algunos casos.


El uso de un gran conjunto de datos:

d1={1: 1, 2: 2, 3: 8, 4: 3, 5: 6, 6: 9, 7: 17, 8: 4, 9: 20, 10: 7, 11: 15, 
    12: 10, 13: 10, 14: 18, 15: 18, 16: 5, 17: 13, 18: 21, 19: 21, 20: 8, 
    21: 8, 22: 16, 23: 16, 24: 11, 25: 24, 26: 11, 27: 112, 28: 19, 29: 19, 
    30: 19, 3077: 36, 32: 6, 33: 27, 34: 14, 35: 14, 36: 22, 4102: 39, 38: 22, 
    39: 35, 40: 9, 41: 110, 42: 9, 43: 30, 44: 17, 45: 17, 46: 17, 47: 105, 48: 12, 
    49: 25, 50: 25, 51: 25, 52: 12, 53: 12, 54: 113, 1079: 50, 56: 20, 57: 33, 
    58: 20, 59: 33, 60: 20, 61: 20, 62: 108, 63: 108, 64: 7, 65: 28, 66: 28, 67: 28, 
    68: 15, 69: 15, 70: 15, 71: 103, 72: 23, 73: 116, 74: 23, 75: 15, 76: 23, 77: 23, 
    78: 36, 79: 36, 80: 10, 81: 23, 82: 111, 83: 111, 84: 10, 85: 10, 86: 31, 87: 31, 
    88: 18, 89: 31, 90: 18, 91: 93, 92: 18, 93: 18, 94: 106, 95: 106, 96: 13, 9232: 35, 
    98: 26, 99: 26, 100: 26, 101: 26, 103: 88, 104: 13, 106: 13, 107: 101, 1132: 63, 
    2158: 51, 112: 21, 113: 13, 116: 21, 118: 34, 119: 34, 7288: 45, 121: 96, 122: 21, 
    124: 109, 125: 109, 128: 8, 1154: 32, 131: 29, 134: 29, 136: 16, 137: 91, 140: 16, 
    142: 104, 143: 104, 146: 117, 148: 24, 149: 24, 152: 24, 154: 24, 155: 86, 160: 11, 
    161: 99, 1186: 76, 3238: 49, 167: 68, 170: 11, 172: 32, 175: 81, 178: 32, 179: 32, 
    182: 94, 184: 19, 31: 107, 188: 107, 190: 107, 196: 27, 197: 27, 202: 27, 206: 89, 
    208: 14, 214: 102, 215: 102, 220: 115, 37: 22, 224: 22, 226: 14, 232: 22, 233: 84, 
    238: 35, 242: 97, 244: 22, 250: 110, 251: 66, 1276: 58, 256: 9, 2308: 33, 262: 30, 
    263: 79, 268: 30, 269: 30, 274: 92, 1300: 27, 280: 17, 283: 61, 286: 105, 292: 118, 
    296: 25, 298: 25, 304: 25, 310: 87, 1336: 71, 319: 56, 322: 100, 323: 100, 325: 25, 
    55: 113, 334: 69, 340: 12, 1367: 40, 350: 82, 358: 33, 364: 95, 376: 108, 
    377: 64, 2429: 46, 394: 28, 395: 77, 404: 28, 412: 90, 1438: 53, 425: 59, 430: 103, 
    1456: 97, 433: 28, 445: 72, 448: 23, 466: 85, 479: 54, 484: 98, 485: 98, 488: 23, 
    6154: 37, 502: 67, 4616: 34, 526: 80, 538: 31, 566: 62, 3644: 44, 577: 31, 97: 119, 
    592: 26, 593: 75, 1619: 48, 638: 57, 646: 101, 650: 26, 110: 114, 668: 70, 2734: 41, 
    700: 83, 1732: 30, 719: 52, 728: 96, 754: 65, 1780: 74, 4858: 47, 130: 29, 790: 78, 
    1822: 43, 2051: 38, 808: 29, 850: 60, 866: 29, 890: 73, 911: 42, 958: 55, 970: 99, 
    976: 24, 166: 112} 

I compararon las siguientes funciones con el fin de comprobar cuál era el más rápido.

def f1(): 
    return next(key for key, value in d1.iteritems() if value == 55) 

def f2a(): 
    return [item[0] for item in d1.items() if item[1] == 55][0] 

def f2b(): 
    return [item[0] for item in d1.iteritems() if item[1] == 55][0] 

def f3(): 
    return dict((v, k) for k, v in d1.iteritems())[55] 

tl=["f1", "f2a", "f2b", "f3"] 
from timeit import Timer 
cmpthese(1000, tl) 

Y aquí están los resultados:

f3 21182/s -- -39% -40% -56% 
f2a 34450/s 63% -- -3% -29% 
f2b 35368/s 67%  3% -- -27% 
f1 48367/s 128% 40% 37% -- 

f1 es más rápido que cualquier otro.

2
Key = next((x for x in d if d[x] == 'a'), None) 

Esto proporciona el resultado deseado si solo existe una clave correspondiente. (¿En el tiempo O (n)?) Ya que se cierra inmediatamente una vez que encuentra una clave calificada.

Keys = [x for x in d if d[x] == 'a'] 

da todas las claves calificadas (en una lista). Y devuelve una lista vacía si no hay tales claves. Este método se llama 'lista de comprensión'.

Evite obtener claves por valores siempre que sea posible. Es bastante ineficiente comparar el acceso a los valores de las claves en O (1).

Esto implica que desea crear un dict inversamente correlacionado en el que las claves y los valores del antiguo dict se cambian como valores y claves en el nuevo dict, si va a utilizar este método con frecuencia a partir de entonces.

Cuestiones relacionadas