Python: Finde den Min, Max-Wert in einer Liste von Tupeln

alist = [(1,3),(2,5),(2,4),(7,5)] 

Ich muss den Minimalwert für jede Position in Tupel bekommen.

Fox Beispiel: Die ausgewertete Ausgabe von Alist ist

 min_x = 1 max_x = 7 min_y = 3 max_y = 5 

Gibt es eine einfache Möglichkeit zu tun?

5 Solutions collect form web for “Python: Finde den Min, Max-Wert in einer Liste von Tupeln”

 map(max, zip(*alist)) 

Diese erste entpackt Ihre Liste, dann findet die max für jede Tupelposition

 >>> alist = [(1,3),(2,5),(2,4),(7,5)] >>> zip(*alist) [(1, 2, 2, 7), (3, 5, 4, 5)] >>> map(max, zip(*alist)) [7, 5] >>> map(min, zip(*alist)) [1, 3] 

Dies wird auch für Tupel beliebiger Länge in einer Liste funktionieren.

 >>> from operator import itemgetter >>> alist = [(1,3),(2,5),(2,4),(7,5)] >>> min(alist)[0], max(alist)[0] (1, 7) >>> min(alist, key=itemgetter(1))[1], max(alist, key=itemgetter(1))[1] (3, 5) 

Zumindest mit Python 2.7 ist der "Zip" nicht nötig, so dass dies vereinfacht, map(max, *data) (wo data ist ein Iterator über Tupel oder Listen der gleichen Länge).

Ein verallgemeinerter Ansatz wäre so etwas wie folgt:

 alist = [(1,6),(2,5),(2,4),(7,5)] temp = map(sorted, zip(*alist)) min_x, max_x, min_y, max_y = temp[0][0], temp[0][-1], temp[1][0], temp[1][-1] 

Für Python 3 brauchst du die Zeile zu ändern, die temp zu schafft:

 temp = tuple(map(sorted, zip(*alist))) 

Die Idee kann in eine Funktion abstrahiert werden, die sowohl in Python 2 als auch in 3 arbeitet:

 from __future__ import print_function try: from functools import reduce # moved into functools in release 2.6 except ImportError: pass # readable version def minmaxes(seq): pairs = tuple() for s in map(sorted, zip(*seq)): pairs += (s[0], s[-1]) return pairs # functional version def minmaxes(seq): return reduce(tuple.__add__, ((s[0], s[-1]) for s in map(sorted, zip(*seq)))) alist = [(1,6), (2,5), (2,4), (7,5)] min_x, max_x, min_y, max_y = minmaxes(alist) print(' '.join(['{},{}']*2).format(*minmaxes(alist))) # 1,7 4,6 triplets = [(1,6,6), (2,5,3), (2,4,9), (7,5,6)] min_x, max_x, min_y, max_y, min_z, max_z = minmaxes(triplets) print(' '.join(['{},{}']*3).format(*minmaxes(triplets))) # 1,7 4,6 3,9 

Eine weitere Lösung mit Aufzählung und Listenverständnis

 alist = [(1,3),(2,5),(2,4),(7,5)] for num, k in enumerate(['X', 'Y']): print 'max_%s' %k, max([i[num] for i in alist]) print 'min_%s' %k, min([i[num] for i in alist]) 
  • Konvertieren für Loop-to-List-Verständnis: Testen, ob Elemente in Liste 2 teilweise für Elemente in Liste 1 übereinstimmen
  • Python: Reißverschluss-ähnliche Funktion, die auf längste Länge pads?
  • Importieren von zufälligen Wörtern aus einer Datei ohne Duplikate Python
  • Falsche Liste wird in Python zurückgegeben
  • Wie bekomme ich eine Liste in einem Wörterbuch mit json.dumps ()
  • Könnte auf Listen schneller sein
  • Wie man chinesisches Wort zeigt, nicht Unicode-Wort
  • Um zu prüfen, ob der Index der Liste existiert
  • Wie kann ich Mathe-Operation auf Listenelemente in Python machen?
  • Python & Pygame: Aktualisieren aller Elemente in einer Liste unter einer Schleife während der Iteration
  • Python-Äquivalent von Haskells [1 ..] (um eine Liste zu indexieren)
  • Python ist die beste Programmiersprache der Welt.