tutorial for compressed comprehension python algorithm list list-comprehension

for - Python: para cada elemento de lista, aplique una función a través de la lista



list comprehension python for (7)

Algunos pitón legible:

def JoeCalimar(l): masterList = [] for i in l: for j in l: masterList.append(1.*i/j) pos = masterList.index(min(masterList)) a = pos/len(masterList) b = pos%len(masterList) return (l[a],l[b])

Avísame si algo no está claro.

Dado [1,2,3,4,5] , ¿cómo puedo hacer algo como

1/1, 1/2, 1/3,1/4,1/5, ...., 3/1,3/2,3/3,3/4,3/5,.... 5/1,5/2,5/3,5/4,5/5

Me gustaría almacenar todos los resultados, encontrar el mínimo y devolver los dos números utilizados para encontrar el mínimo. Entonces, en el caso que describí anteriormente, me gustaría regresar (1,5) .

Así que, básicamente, me gustaría hacer algo como

para cada elemento i en la lista mapear alguna función en todos los elementos de la lista, tomando i y j como parámetros, almacene el resultado en una lista maestra, encuentre el valor mínimo en la lista maestra y devuelva los argumentos i , j usados ​​para calcular este valor mínimo.

En mi problema real, tengo una lista de objetos / coordenadas, y la función que estoy usando toma dos coordenadas y calcula la distancia euclidiana. Estoy tratando de encontrar una distancia euclidiana mínima entre dos puntos, pero no necesito un algoritmo elegante.


Haciéndolo de la manera mathy ...

nums = [1, 2, 3, 4, 5] min_combo = (min(nums), max(nums))

A menos que, por supuesto, tengas negativos allí. En ese caso, esto no funcionará porque realmente quiere los valores absolutos mínimo y máximo: el numerador debe estar cerca de cero y el denominador alejado de él, en cualquier dirección. Y los dobles negativos lo romperían.


Si estoy en lo cierto al pensar que desea encontrar el valor mínimo de una función para todos los pares posibles de 2 elementos de una lista ...

l = [1,2,3,4,5] def f(i,j): return i+j # Prints min value of f(i,j) along with i and j print min( (f(i,j),i,j) for i in l for j in l)


Si trabaja con Python ≥2.6 (incluyendo 3.x), puede:

from __future__ import division import operator, itertools def getmin(alist): return min( (operator.div(*pair), pair) for pair in itertools.product(alist, repeat=2) )[1] getmin([1, 2, 3, 4, 5])

EDITAR: Ahora que lo pienso y si recuerdo mis matemáticas correctamente, esto también debería dar la respuesta suponiendo que todos los números son no negativos:

def getmin(alist): return min(alist), max(alist)


Puedes hacer esto usando listas de comprensión y min () (código de Python 3.0):

>>> nums = [1,2,3,4,5] >>> [(x,y) for x in nums for y in nums] [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)] >>> min(_, key=lambda pair: pair[0]/pair[1]) (1, 5)

Tenga en cuenta que para ejecutar esto en Python 2.5 tendrá que hacer que uno de los argumentos sea flotante, o hacer from __future__ import division para que 1/5 correctamente sea igual a 0.2 en lugar de 0.


>>> nums = [1, 2, 3, 4, 5] >>> min(map((lambda t: ((float(t[0])/t[1]), t)), ((x, y) for x in nums for y in nums)))[1] (1, 5)


Si no le importa importar el paquete numpy, tiene mucha funcionalidad conveniente incorporada. Es probable que sea mucho más eficiente usar sus estructuras de datos que listas de listas, etc.

from __future__ import division import numpy data = numpy.asarray([1,2,3,4,5]) dists = data.reshape((1,5)) / data.reshape((5,1)) print dists which = dists.argmin() (r,c) = (which // 5, which % 5) # assumes C ordering # pick whichever is most appropriate for you... minval = dists[r,c] minval = dists.min() minval = dists.ravel()[which]