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]