2011-02-04 24 views
5

Tengo un diccionario con una clave (x,y), donde (x,y) significa lo mismo que (y,x), ¿Cómo debo hacer esto?Buscar una tupla en un diccionario de python que coincida (x, y) o (y, x)

que puedo hacer:

>>> d = {(1,2): "foo"} 
>>> i = d.get(2,1) 
>>> if i is None: 
...  i = d.get((1,2)) 
... 
>>> i 
'foo' 

¿Hay una mejor manera de hacer esto, por lo que habría d.get((2,1)) coincidir con la clave (1,2) directamente? idealmente me gustaría insertar, p. (2,1) y no debe ser distinto de la clave (1,2) también.

+0

¿Qué sucede si ambos existen? Debe normalizar sus claves, por lo que solo hay una representación para una clave en particular. –

+0

@Glenn Maynard ¿Cómo podría normalizar esto? Obtengo una entrada externa en forma de un par x, y y necesito relacionarla con el mismo valor para la entrada x, y y y, x. – Anonym

+0

Una pregunta muy similar está aquí: http://stackoverflow.com/questions/4368423/python-symmetric-dictionary-where-dab-dba/4370725#4370725 –

Respuesta

10

Usa conjuntos congelados en lugar de tuplas.

d = {frozenset((1,2)): "foo"} 
print d.get(frozenset((2,1))) 
1

Necesita su propio tipo de datos. Algo que devuelve el mismo valor para __hash__ para (1, 2) y (2, 1).

¿Pero por qué quieres hacer esto? ¿Quieres un conjunto en lugar de una tupla? Eso sería algo como:

d = {} 
d[frozenset((1, 2))] = 'something' 
s = frozenset((2,1)) 
if s in d: 
    print '(2, 1) is in the dict' 
else: 
    print 'not found' 

Tenga en cuenta que debe ser un frozenset, porque las claves de diccionario deben ser inmutables.

+0

+1 al uso de conjuntos. Aunque necesita un 'frozenset' para usar como clave de diccionario. –

1
def normalise_input_pair(x, y): 
    return x, y if x <= y else y, x 

uso de memoria puede ser una consideración; ¿Cuántos de estos tienes?

>>> sys.getsizeof(frozenset((1,2))) 
116 
>>> sys.getsizeof((1,2)) 
36 
>>> 
+0

Esto probablemente coincida más con lo que necesito (más adelante al menos) - pero aceptaré btilmente 'responda ya que esa es una respuesta más directa a la pregunta – Anonym

+0

@Anónimo: por favor infórmenos sobre por qué 'frozenset ((x, y)) 'es una respuesta más directa que' normalise_input_pair (x, y) 'a" ¿Cómo debo hacer esto? " –

Cuestiones relacionadas