it-swarm.com.de

Python: Finden Sie den minimalen und maximalen Wert in einer Liste von Tupeln

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

Ich muss den minimalen Maximalwert für jede Position in Tuple ermitteln.

Fox-Beispiel: Die erwartete Ausgabe von Alist ist

min_x = 1
max_x = 7

min_y = 3
max_y = 5

Gibt es einen einfachen Weg?

26
user483144
map(max, Zip(*alist))

Dies entpackt zuerst Ihre Liste und ermittelt dann den Maximalwert für jede Tuple-Position

>>> 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 funktioniert auch für Tupel beliebiger Länge in einer Liste.

60
cobbal
>>> 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)
8
John La Rooy

Zumindest bei Python 2.7 ist die "Zip" nicht erforderlich, so dass map(max, *data) vereinfacht wird (wobei data ein Iterator über Tupel oder Listen gleicher Länge ist).

3
tiwo

Ein verallgemeinerter Ansatz wäre etwa so:

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 müssen Sie die Zeile ändern, in der die Variabletempto erstellt wird:

temp = Tuple(map(sorted, Zip(*alist)))

Die Idee kann in eine Funktion abstrahiert werden, die in Python 2 und 3 funktioniert:

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
3
martineau

Eine andere Lösung, die Aufzählung und Listenverständnis verwendet

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