与えられた[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
は、リスト内のすべての要素に関数をマッピングし、i
およびj
をパラメーターとして取得し、結果をマスターリストに格納し、最小値を見つけます。マスターリストで、引数i
、j
usedを使用して、この最小値を計算します。
私の実際の問題では、リストオブジェクト/座標があり、使用している関数は2つの座標を取り、ユークリッド距離を計算します。任意の2点間の最小ユークリッド距離を見つけようとしていますが、派手なアルゴリズムは必要ありません。
list comprehensions および 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 division
これにより、1/5は0ではなく0.2に正しくなります。
リストから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)
読みやすい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])
何かはっきりしないことがあれば教えてください。
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]
賢いやり方で...
nums = [1, 2, 3, 4, 5]
min_combo = (min(nums), max(nums))
もちろん、そこにネガがなければ。その場合、実際には最小と最大の絶対値が必要なため、これは機能しません。分子はゼロに近く、分母はどちらの方向でもゼロに近いはずです。そして、二重の否定はそれを壊すでしょう。
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)