ylab color categoryorder python set union intersection

python - color - plotly layout



Python establece Union y establece Intersection operar de manera diferente? (4)

Cuando haces set() estás creando un conjunto vacío. Cuando set().intersection(...) , está intersecando este conjunto vacío con otras cosas. La intersección de un conjunto vacío con cualquier otra colección de conjuntos está vacía.

Si realmente tiene una lista de conjuntos , puede obtener su intersección similar a cómo lo hizo.

>>> x = [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}] >>> set.intersection(*x) set([3])

Sin embargo, no puedes hacer esto directamente con la forma en que lo haces, porque en realidad no tienes ningún conjunto en tu ejemplo con intersection(*...) . Usted acaba de tener una lista de listas . Primero debe convertir los elementos en su lista a conjuntos. Entonces si tienes

x = [[1,2,3], [2,3,4]]

deberías hacer

x = [set(a) for a in x]

Estoy haciendo algunas operaciones de conjunto en Python, y noté algo extraño ...

>> set([1,2,3]) | set([2,3,4]) set([1, 2, 3, 4]) >> set().union(*[[1,2,3], [2,3,4]]) set([1, 2, 3, 4])

Eso es bueno, comportamiento esperado, pero con intersección:

>> set([1,2,3]) & set([2,3,4]) set([2, 3]) >> set().intersection(*[[1,2,3], [2,3,4]]) set([])

¿Estoy perdiendo la cabeza aquí? ¿Por qué no set.intersection () funciona como esperaba?

¿Cómo puedo hacer la intersección de muchos conjuntos como lo hice con la unión (suponiendo que el [[1,2,3], [2,3,4]] tuviera un montón más listas)? ¿Cuál sería la forma "pitonica"?


[respuesta incorrecta quitada]

Como @Anto Vinish sugirió que primero debe convertir las listas a conjuntos y luego usar set.intersection

Por ejemplo:

>>> sets = [set([1, 2, 3]), set([2, 3, 4]), set([3, 4, 5])] >>> set.intersection(*sets) set([3])


convertir la lista para establecer primero

>>> set.intersection(*[set([1,2,3]), set([2,3,4])]) set([2, 3])

Para listas múltiples que puedes usar,

>>> set.intersection(*[set([1,2,3]), set([2,3,4]), set([5,3,4])]) set([3])


set().intersection(*[[1,2,3], [2,3,4]])

está, por supuesto, vacío porque comienzas con el conjunto vacío y lo intersectas con todos los demás

Puedes intentar llamar al método en la class

set.intersection(*[[1,2,3], [2,3,4]])

pero eso no funcionará porque el primer argumento pasado necesita ser un conjunto

set.intersection({1, 2, 3}, *[[2,3,4], ...])

Esto parece incómodo, mejor si pudiera usar una lista de conjuntos en primer lugar. Especialmente si provienen de un generador que hace que sea difícil sacar el primer elemento limpiamente

set.intersection(*[{1,2,3}, {2,3,4}])

De lo contrario, puedes convertirlos en conjuntos

set.intersection(*(set(x) for x in [[1,2,3], [2,3,4]]))