Foros del Web » Programando para Internet » Python »

Operaciones con funciones all y any

Estas en el tema de Operaciones con funciones all y any en el foro de Python en Foros del Web. Hola de nuevo, Estas funciones se pueden combinar de muchas maneras y ahorrar en cierto modo los or , not y and . Osea, chequean ...
  #1 (permalink)  
Antiguo 16/10/2015, 10:52
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Operaciones con funciones all y any

Hola de nuevo,

Estas funciones se pueden combinar de muchas maneras y ahorrar en cierto modo los or, not y and. Osea, chequean sobre una iteracion de elementos y devuelven True o False del conjunto total.

Hace poco he descubierto el operador de comparacion delante de un for

Código Python:
Ver original
  1. any(i == 2 for i in (1,2,3))
True (Hay al menos un dos en la tupla)

Código Python:
Ver original
  1. all(i == 2 for i in (1,2,3))
False (Todos los numeros de la tupla no son un dos)

Esto es una forma sencilla de expresar estas funciones. Pero por lo que veo, el for itera sobre la tupla. Y a mi me gustaria que iterara sobre la tupla y mas elementos delante del for. Y entonces nos devolviera True o False.

Ejemplo:

Código Python:
Ver original
  1. any(i == (1,3) for i in (1,2,3))
Y que nos diera True, por que el 1 y el 3 estan en la tupla el for

o

Código Python:
Ver original
  1. all(i == (3, 3) for i in (3,3,3))
Tambien True, ya que el 3 y el 3 estan en la tupla del for.

Se trataria que en ambas funciones habrian doble iteraciones. Y una vez acabadas, devolvieran True o False.
  #2 (permalink)  
Antiguo 16/10/2015, 12:53
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 8 meses
Puntos: 18
Respuesta: Operaciones con funciones all y any

Esto :
Código Python:
Ver original
  1. any(i == (1,3) for i in (1,2,3))
siempre será falso porqué estas buscando una tupla: (1,3) en otra de números enteros (1,2,3).
Debes hacer tu propia función.
Hay muchas formas de hacerlo, puedes convertir (1,2,3) en una combinación de tuplas ( (1,2), (1,3) ...)

Código Python:
Ver original
  1. import itertools
  2. print any(i == (1,3) for i in (itertools.product((1,2,3),repeat=2)))

Pero parece mas sencillo usar listas por comprensión o varios bucles for y prescindir de 'any'

Intentalo.

saludos.
  #3 (permalink)  
Antiguo 16/10/2015, 13:02
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: Operaciones con funciones all y any

Si, tienes razon. Aunque al principio son una tentacion usar 'any' y 'all' (sobre todo para cosas simples), como queramos poner muchas condiciones se lia un poco el codigo. No sabe uno si va arrojar True o False.

Trato de hacer eso:

Imagina 4 vectores que se han de combinar entre si (de dos vectores en dos) sin repetir numero entre ellos:

Código Python:
Ver original
  1. from itertools import combinations
  2.  
  3. matriz = ([1,2,3], [4,5,6], [7,8,9],[1,10,11])
  4. for x in combinations(matriz, 2):
  5.     print(x)

Este script devuelve:

Código Python:
Ver original
  1. ([1, 2, 3], [4, 5, 6])
  2. ([1, 2, 3], [7, 8, 9])
  3. ([1, 2, 3], [1, 10, 11]) # Este vector no debe aparecer
  4. ([4, 5, 6], [7, 8, 9])
  5. ([4, 5, 6], [1, 10, 11])
  6. ([7, 8, 9], [1, 10, 11])

Pero yo quiero que devuelva:

Código Python:
Ver original
  1. ([1, 2, 3], [4, 5, 6])
  2. ([1, 2, 3], [7, 8, 9])
  3. ([4, 5, 6], [7, 8, 9])
  4. ([4, 5, 6], [1, 10, 11])
  5. ([7, 8, 9], [1, 10, 11])

Ya que:
([1, 2, 3], [1, 10, 11])
Repite el numero 1 entre ambos vectores.




Probare con bucles for y listas por compresion como dices. Mañana posteo algo. Gracias!

EDITO:

Bueno, he ido un poco mas rapido. He utilizado la clausula else en un for (todavia no he usado la lista por compresion):

Código Python:
Ver original
  1. matriz = ([1,2,3], [4,5,6], [7,8,9],[1,10,11])
  2.  
  3. for vector in combinations(matriz, 2):
  4.     for i in vector[0]:
  5.         if i in vector[1]:
  6.             break
  7.     else:
  8.         print(vector)

Resultado:

Código Python:
Ver original
  1. ([1, 2, 3], [4, 5, 6])
  2. ([1, 2, 3], [7, 8, 9])
  3. ([4, 5, 6], [7, 8, 9])
  4. ([4, 5, 6], [1, 10, 11])
  5. ([7, 8, 9], [1, 10, 11])

Como se puede observar no sale la pareja combinada:

Código Python:
Ver original
  1. ([1, 2, 3], [1, 10, 11])

Ya que se repite en ambos vectores el numero 1. Supongo que habra miles de maneras de hacerlo. Y claro, no se si es necesario usar las funciones 'any' o 'all' en este caso.

Última edición por Koan; 16/10/2015 a las 13:50
  #4 (permalink)  
Antiguo 17/10/2015, 05:03
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: Operaciones con funciones all y any

Al final he podido crear un lista por comprension. Aunque claro, pasa de los 80 caracteres y no esta muy bien visto en Python. Aparte, creo que a veces, este tipo de listas son menos legibles.

Como no puedo meter ni el break ni el else en la lista por comprension, he transformado los vectores en conjuntos. Y aplicando el metodo intersection me filtra que no haya coincidencias entre grupos.


Código Python:
Ver original
  1. matriz = ([1,2,3], [4,5,6], [4,5,7], [7,8,9],[1,10,11])

SIN COMPRENSION:

Código Python:
Ver original
  1. for vector in combinations(matriz, 2):
  2.     if set(vector[0]).intersection(set(vector[1])) == set():
  3.         print(vector)

LISTA POR COMPRENSION:

Código Python:
Ver original
  1. sinRepetir = [vector for vector in combinations(matriz,2) if set(vector[0]).intersection(set(vector[1])) == set()]

RESULTADO:

Código Python:
Ver original
  1. ([1, 2, 3], [4, 5, 6])
  2. ([1, 2, 3], [4, 5, 7])
  3. ([1, 2, 3], [7, 8, 9])
  4. ([4, 5, 6], [7, 8, 9])
  5. ([4, 5, 6], [1, 10, 11])
  6. ([4, 5, 7], [1, 10, 11])
  7. ([7, 8, 9], [1, 10, 11])

Última edición por Koan; 17/10/2015 a las 05:42

Etiquetas: funciones, operaciones, vez
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:37.