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 \ a
pero 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
set
y 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 }
tuple
y 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
a
yb
con 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.