it-swarm.com.de

Python: Wenden Sie für jedes Listenelement eine Funktion in der Liste an

Mit [1,2,3,4,5], wie kann ich so etwas machen 

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

Ich möchte alle Ergebnisse speichern, das Minimum ermitteln und die beiden Zahlen zurückgeben, mit denen das Minimum ermittelt wurde. In dem Fall, den ich oben beschrieben habe, möchte ich (1,5) zurückgeben.

Also im Grunde würde ich so etwas gerne machen

für jedes Element i in der Listemap eine Funktion für alle Elemente in der Liste, i und j als Parameterstore das Ergebnis in einer Hauptliste, ermitteln Sie den Mindestwert in der Hauptliste und geben Sie die Argumente zurück i, jverwendet zur Berechnung dieses Mindestwerts.

In meinem eigentlichen Problem habe ich eine Liste Objekte/Koordinaten, und die Funktion, die ich verwende, nimmt zwei Koordinaten und berechnet die euklidische Entfernung. Ich versuche, einen minimalen euklidischen Abstand zwischen zwei beliebigen Punkten zu finden, aber ich brauche keinen ausgefallenen Algorithmus.

25
joe calimar

Sie können dies mit List Comprehensions und min () (Python 3.0-Code) tun:

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

Beachten Sie, dass Sie für die Ausführung unter Python 2.5 entweder eines der Argumente als Float definieren oder from __future__ import division ausführen müssen, damit 1/5 korrekt 0,2 statt 0 ist.

42
Kiv

Wenn ich richtig denke, dass Sie den Mindestwert einer Funktion für alle möglichen Paare von 2 Elementen aus einer Liste ermitteln möchten ...

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)
10
Triptych

Einige lesbare Pythons:

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

Lass es mich wissen, wenn etwas nicht klar ist.

3
Andrea Ambu

Wenn Sie nichts dagegen haben, das numpy-Paket zu importieren, verfügt es über viele praktische Funktionen. Es ist wahrscheinlich viel effizienter, ihre Datenstrukturen als Listenlisten usw. zu verwenden.

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
Mr Fooz

Auf die mathematische Art und Weise ...

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

Es sei denn, Sie haben natürlich Negative. In diesem Fall funktioniert das nicht, weil Sie tatsächlich die minimalen und maximalen absoluten Werte wünschen - der Zähler sollte nahe bei Null liegen und der Nenner in jeder Richtung von ihm entfernt sein. Und doppelte Negative würden es brechen.

2
Nikhil Chelliah

Wenn Sie mit Python ≥2.6 (einschließlich 3.x) arbeiten, können Sie:

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

EDIT: Nun, wenn ich daran denke und wenn ich mich richtig an meine Mathematik erinnere, sollte dies auch die Antwort geben, vorausgesetzt, dass alle Zahlen nicht negativ sind:

def getmin(alist):
    return min(alist), max(alist)
1
tzot
>>> 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)
0