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

すべての結果を保存し、最小値を見つけて、最小値を見つけるために使用された 2 つの数値を返したいと思います。したがって、上記の場合は返品したいと思い(1,5)ます。

だから基本的に私は次のようなことをしたいと思います

リスト内の各要素iに対して、リスト内のすべての要素に何らかの関数をマップし、 をパラメータとして取りij結果をマスター リストに格納し、マスター リスト内の最小値を見つけ、この最小値の計算iに使用される引数を返します。j

私の実際の問題では、リストオブジェクト/座標があり、使用している関数は2つの座標を取り、ユークリッド距離を計算します。任意の 2 点間の最小ユークリッド距離を見つけようとしていますが、凝ったアルゴリズムは必要ありません。

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 で実行するには、引数の 1 つを float にするか、from __future__ import division1/5 が 0 ではなく 0.2 に正しく等しくなるようにする必要があることに注意してください。

于 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

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 に答える
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 に答える
1

数学的な方法でそれを行う...

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

もちろん、そこにネガがある場合を除きます。その場合、実際には最小絶対値と最大絶対値が必要なため、これは機能しません。どちらの方向でも、分子はゼロに近く、分母はそれから離れている必要があります。そして、二重否定はそれを壊します。

于 2009-01-29T23:07:14.743 に答える
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 に答える