2012-06-15 8 views
5

leí "Python Cookbook" y ver lo que en una receta "Obtención de la intersección de dos diccionarios" autores recomiendan el uso de tales sola línea:Sin has_key() para Python 3 diccionarios

filter(another_dict.has_key, some_dict.keys()) 

Pero desde Python 3 diccionarios no tienen el método has_key() ¿cómo debo modificar el código sugerido? Supongo que podría haber algún método interno __ en __() o algo así.

¿Alguna idea, por favor?

Respuesta

17

Python 3 tiene vistas de clave de diccionario, un concepto mucho más poderoso. Su código se puede escribir como

some_dict.keys() & another_dict.keys() 

en Python 3.x. Esto devuelve las claves comunes de los dos diccionarios como un conjunto.

Esto también está disponible en Python 2.7, utilizando el método dict.viewkeys().

Como una aproximación más exacta del código original, también se puede utilizar una lista de comprensión:

[key for key in some_dict if key in another_dict] 

Una aún más partido del código original sería utilizar dict.__contains__(), que es el método mágico que corresponde a la in operador:

filter(another_dict.__contains__, some_dict.keys()) 

Pero, por favor, no use este código. Recomiendo ir con la primera versión, que es la única que destaca la simetría entre some_dict y another_dict.

+0

¿Cuál es la diferencia entre 'some_dict.keys() & another_dict.keys()' y 'another_dict.keys() & some_dict.keys()'? –

+2

Ninguno. La operación de intersección es conmutativa. – ThiefMaster

+0

¡Esto es lo que estaba buscando! Muchas gracias. –

Cuestiones relacionadas