alist = [(1,3),(2,5),(2,4),(7,5)]
I need to get the min max value for each position in tuple.
我需要获取元组中每个位置的最小最大值。
Fox example: The exepected output of alist is
福克斯的例子:alist的预期输出是
min_x = 1
max_x = 7
min_y = 3
max_y = 5
Is there any easy way to do?
有什么简单的方法吗?
5 个解决方案
#1
59
map(max, zip(*alist))
This first unzips your list, then finds the max for each 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]
This will also work for tuples of any length in a list.
这也适用于列表中任何长度的元组。
#2
8
>>> 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)
#3
3
At least with Python 2.7, the "zip" is not necessary, so this simplifies to map(max, *data)
(where data
is an iterator over tuples or lists of the same length).
至少在Python 2.7中,“zip”不是必需的,因此这简化了map(max,* data)(其中数据是元组上的迭代器或相同长度的列表)。
#4
3
A generalized approach would be something like this:
一般化的方法是这样的:
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]
For Python 3, you'd need change the line that createstemp
to:
对于Python 3,您需要更改createdtempto的行:
temp = tuple(map(sorted, zip(*alist)))
The idea can be abstracted into a function which works in both Python 2 and 3:
这个想法可以被抽象成一个在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
#5
0
Another solution using enumerate and list comprehension
使用枚举和列表理解的另一种解决方案
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])
#1
59
map(max, zip(*alist))
This first unzips your list, then finds the max for each 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]
This will also work for tuples of any length in a list.
这也适用于列表中任何长度的元组。
#2
8
>>> 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)
#3
3
At least with Python 2.7, the "zip" is not necessary, so this simplifies to map(max, *data)
(where data
is an iterator over tuples or lists of the same length).
至少在Python 2.7中,“zip”不是必需的,因此这简化了map(max,* data)(其中数据是元组上的迭代器或相同长度的列表)。
#4
3
A generalized approach would be something like this:
一般化的方法是这样的:
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]
For Python 3, you'd need change the line that createstemp
to:
对于Python 3,您需要更改createdtempto的行:
temp = tuple(map(sorted, zip(*alist)))
The idea can be abstracted into a function which works in both Python 2 and 3:
这个想法可以被抽象成一个在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
#5
0
Another solution using enumerate and list comprehension
使用枚举和列表理解的另一种解决方案
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])