25

鉴于[1,2,3,4,5],我该怎么做

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

我想存储所有结果,找到最小值,然后返回用于查找最小值的两个数字。因此,在我上面描述的情况下,我想返回(1,5).

所以基本上我想做类似的事情

对于列表中的每个元素i,映射列表中所有元素的某个函数,以ij作为参数将结果存储在主列表中,在主列表中找到最小值,并返回用于计算该最小值的i参数j

在我真正的问题中,我有一个对象/坐标列表,我使用的函数需要两个坐标并计算欧几里得距离。我试图找到任意两点之间的最小欧几里德距离,但我不需要花哨的算法。

4

7 回答 7

42

您可以使用列表推导min()(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)

请注意,要在 Python 2.5 上运行它,您需要将其中一个参数设为浮点数,或者from __future__ import division使 1/5 正确地等于 0.2 而不是 0。

于 2009-01-29T21:07:47.700 回答
10

如果我认为您想为列表中所有可能的 2 个元素对找到函数的最小值是正确的...

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)
于 2009-01-29T21:17:20.440 回答
3

一些可读的python:

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])

如果有不清楚的地方,请告诉我。

于 2009-01-29T21:08:51.550 回答
3

如果您不介意导入 numpy 包,它内置了许多方便的功能。使用它们的数据结构可能比使用列表等更有效。

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]
于 2009-01-30T01:59:58.000 回答
1

用数学的方式做...

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

当然,除非你有底片。在这种情况下,这将不起作用,因为您实际上想要最小和最大绝对值 - 分子应该接近于零,而分母应该远离它,在任一方向上。双重否定会打破它。

于 2009-01-29T23:07:14.743 回答
1

如果使用 Python ≥2.6(包括 3.x),您可以:

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])

编辑:现在我想到了,如果我正确地记住了我的数学,假设所有数字都是非负的,这也应该给出答案:

def getmin(alist):
    return min(alist), max(alist)
于 2009-01-30T18:14:40.123 回答
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)
于 2009-11-23T16:50:45.077 回答