2011-01-11 31 views
7
dic1 = {'a':'a','b':'c','c':'d'} 
dic2 = {'b':'a','a':'c','c':'d'} 

dic1.keys() =>['a', 'b', 'c'] 
dic2.keys() =>['b', 'a', 'c'] 

dic1 y dic2 tienen las mismas teclas, pero en orden diferente.Python: cómo saber si dos diccionarios tienen las mismas claves

¿Cómo decir que tienen las mismas llaves (no considera la orden)?

+0

no se ordenan las teclas(), si es posible. – user469652

+1

¿Por qué no? Es * posible * que no ordene la clave, pero esa es una restricción extraña y arbitraria. ¿Es esta tarea? –

+2

"dic1 y dic2 tienen las mismas teclas, pero en diferente orden". - Esto no tiene sentido en un diccionario de Python: las claves no están ordenadas. – eumiro

Respuesta

22

pitón 2,7

dict views: Soporta operaciones de conjuntos directos, etc.

>>> dic1 = {'a':'a','b':'c','c':'d'} 
>>> dic2 = {'b':'a','a':'c','c':'d'} 
>>> dic1.viewkeys() == dic2.viewkeys() 
True 
>>> dic1.viewkeys() - dic2.viewkeys() 
set([]) 
>>> dic1.viewkeys() | dic2.viewkeys() 
set(['a', 'c', 'b']) 

de manera similar en 3.x: (THX @lennart)

>>> dic1 = {'a':'a','b':'c','c':'d'} 
>>> dic2 = {'b':'a','a':'c','c':'d'} 
>>> dic1.keys() == dic2.keys() 
True 
>>> dic1.keys() - dic2 
set() 
>>> dic1.keys() | dic2 
{'a', 'c', 'b'} 

Python 2.4+

set operation: iteración directa sobre las claves de diccionario en un conjunto

>>> dic1 = {'a':'a','b':'c','c':'d'} 
>>> dic2 = {'b':'a','a':'c','c':'d'} 
>>> set(dic1) == set(dic2) 
True 
+2

Se acaba de llamar "keys()" en Python 3. –

+0

Thx @Lennart! Fijo – kevpie

10
set(dic1.keys()) == set(dic2.keys()) 
+2

@Summer: las teclas de un dict no pueden contener elementos duplicados, por la definición de un dict. –

+0

Sí, pero el método keys() devuelve una lista y no puedo garantizar que los elementos en dos listas estén en el mismo orden. Es por eso que usar un conjunto. – gruszczy

0

No estoy seguro de cómo se terminó haciendo keys() retorno que una lista común sin clasificar sorted(dict1.keys()) == sorted(dict2.keys()) debe hacerlo.

1

Podemos utilizar todo

all(k in dic2 for k in dic1) and all(k in dic1 for k in dic2) 
+0

Se podría ir y len (dic1) == len (dic2) para la segunda mitad –

Cuestiones relacionadas