python - potencia - programa en c++ de operaciones de conjuntos
¿Cómo acceder a un elemento de un conjunto usando un objeto equivalente? (2)
Si tengo un objeto que se compare con un elemento de un conjunto Python, pero no es el mismo objeto, ¿hay alguna forma razonable de obtener una referencia al objeto en el conjunto? El caso de uso usaría el conjunto para identificar y compartir datos duplicados.
Ejemplo (Python 2.7):
>>> a = "This is a string"
>>> b = "This is a string"
>>> a is b
False
>>> a == b
True
>>> s = set((a,))
>>> b in s
True
¿Cómo obtener una referencia a a
uso de b
y s
? Puedo pensar de una manera, pero no estoy seguro si no depende de la implementación si obtienes a
o b
. EDITAR: Esto no funciona cuando s tiene más de un elemento; La intersección se implementa naturalmente como [x for x in smaller_set if x in larger_set]
>>> for x in set((b,)).intersection(s): c = x
...
>>> c is a
True
Quizás una buena solución sería usar un dict que asigna cada clave a sí mismo, en lugar del conjunto.
Su caso de uso parece que es un caso de uso para los diccionarios. Utilice, como claves, el atributo del objeto que se compare con el objeto "extraño", y como valores los objetos deseados.
Sin embargo, si se trata de un caso de uso simple, y usted puede tener un seartch lineal, podría hacer lo obvio: no sería malo:
def get_equal(in_set, in_element):
for element in in_set:
if element == in_element:
return element
return None
Si necesita qué es exactamente lo que está solicitando (me pregunto algunos casos de uso para eso), lo que hay que hacer es crear una clase de diccionario personalizada que tenga un conjunto como uno de sus miembros, implementar métodos de proxy para el conjunto de miembros. , y tanto en el diccionario como en los métodos establecidos, mantiene la sincronización tanto del diccionario como del contenido. Esto llevaría mucho tiempo implementarlo correctamente, pero relativamente sencillo.
Encontré una pregunta similar en python-list: Obtener elemento del conjunto . Hay una respuesta inteligente con referencia a get_equivalent (contenedor, artículo) (receta de Python) .
El truco consiste en construir un objeto envoltorio para el objeto ''clave'' y verificar si el envoltorio está en el conjunto usando el operador in
. Si el contenido del hash es igual a la clave, su método __eq__
puede obtener acceso al objeto en el conjunto y guardar una referencia al mismo. Un punto importante de la discusión es que el método __eq__
de los elementos establecidos debe devolver NotImplemented
para los tipos no reconocidos, de lo contrario, el __eq__
la envoltura puede no ser llamado.