首页 文章

Python:对于每个列表元素,在列表中应用一个函数

提问于
浏览
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 作为参数将结果存储在主列表中,在主列表中找到最小值,并返回用于计算的参数 ij 这个最小值 .

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

7 回答

  • 42
    >>> 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)
    
  • 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]
    
  • 3

    您可以使用list comprehensionsmin()(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上运行它,您需要将其中一个参数设置为float,或者执行 from __future__ import division 以使1/5正确等于0.2而不是0 .

  • 0

    一些可读的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])
    

    如果有什么不清楚,请告诉我 .

  • 10

    如果使用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)
    
  • 1

    如果我认为您想要从列表中找到所有可能的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)
    
  • 2

    这样做的方式......

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

    当然,除非你在那里有负面影响 . 在这种情况下,这将不起作用,因为你实际上想要最小和最大绝对值 - 分子应该接近于零,并且分母在任何方向上都远离它 . 而双重否定将打破它 .

相关问题