Digamos que tengo dos set()s:
a = {('1', '2', '3', 'a'), ('1', '2', '4', 'a'), ('1', '2', '5', 'b')}
b = {('1', '2', '3', 'b'), ('1', '2', '4', 'b'), ('1', '2', '6', 'b')}
Ahora, lo que quiero hacer es encontrar la diferencia establecida b \ apero ignorando el último elemento de cada tupla. Entonces es como hacer algo como esto:
a = {('1', '2', '3'), ('1', '2', '4'), ('1', '2', '5')}
b = {('1', '2', '3'), ('1', '2', '4'), ('1', '2', '6')}
In[1]: b - a
Out[1]: {('1', '2', '6')}
Rendimiento esperado:
b \ a = {('1', '2', '6', 'b')}
¿Hay alguna forma obvia / pitónica de lograr esto sin tener que iterar manualmente sobre cada conjunto y compararlo tuple[:3]?
python
python-2.7
set
Grajdeanu Alex.
fuente
fuente

sety sobrescribir la operación de diferencia. No conozco ninguna solución lista para usar y dudo que exista.aa = { t[:3] for t in a }tupley anulación del operador de diferenciaRespuestas:
Así es como puede escribir su propia clase para anular el comportamiento de hash normal de una tupla:
con salida
Para modificar la forma en que se comportan los conjuntos de tuplas, tenemos que modificar la forma en que se procesan las tuplas.
A partir de aquí ,
Entonces, para que el hash ignore el último elemento, tenemos que sobrecargar los métodos dunder
__eq__y de manera__hash__adecuada. Esto no termina siendo tan difícil porque todo lo que tenemos que hacer es cortar el último elemento y luego delegarlo a los métodos apropiados de forma normaltuple.Otras lecturas:
fuente
:). En realidad, solo combina bits y piezas de sobrecarga del operador y cómo funciona el hash en Python.Aquí hay un enfoque que define
aybcon listas en lugar de conjuntos, ya que me parece que la solución más directa implica la indexaciónb:fuente
Los juegos funcionan bien. Son sus datos los que no funcionan bien. Si se ven diferentes pero en realidad son lo mismo, defina un tipo de datos que se comporte como usted desea. Luego, el conjunto funciona muy bien por sí solo.
fuente
__repr__y__hash__en términos de tuplas, pero no__eq__. ¿No sería más corto usar tuplas aquí también? De hecho, puede usar la división aquí y en__hash__para acortar aún más el código.