alist = [(1,3),(2,5),(2,4),(7,5)]
タプルの各位置の最小最大値を取得する必要があります。
Foxの例:alistの実際の出力は
min_x = 1
max_x = 7
min_y = 3
max_y = 5
簡単な方法はありますか?
map(max, Zip(*alist))
これは最初にリストを解凍し、次に各タプルの位置の最大値を見つけます
>>> 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]
これは、リスト内の任意の長さのタプルにも機能します。
>>> 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)
少なくとも Python 2.7 の場合、「Zip」は必要ないため、これによりmap(max, *data)
が簡略化されます(ここで、data
はタプルまたは同じリストのイテレータです)長さ)。
一般的なアプローチは次のようなものです。
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]
Python 3の場合、creates temp
toを変更する必要があります。
temp = Tuple(map(sorted, Zip(*alist)))
アイデアは、Python 2と3の両方で機能する関数に抽象化できます。
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
列挙とリストの理解を使用する別のソリューション
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])