Python 从元组列表中获取正确的最大值
我的元组列表如下所示:Python 从元组列表中获取正确的最大值,python,python-3.x,list,tuples,Python,Python 3.x,List,Tuples,我的元组列表如下所示: [(0, 0), (3, 0), (3, 3), (0, 3), (0, 0), (0, 6), (3, 6), (3, 9), (0, 9), (0, 6), (6, 0), (9, 0), (9, 3), (6, 3), (6, 0), (0, 3), (3, 3), (3, 6), (0, 6), (0, 3)] xs, ys = zip(*listoftuples) x_min_max, y_min_max = [(min(L), max(L)) for L
[(0, 0), (3, 0), (3, 3), (0, 3), (0, 0), (0, 6), (3, 6), (3, 9), (0, 9), (0, 6), (6, 0), (9, 0), (9, 3), (6, 3), (6, 0), (0, 3), (3, 3), (3, 6), (0, 6), (0, 3)]
xs, ys = zip(*listoftuples)
x_min_max, y_min_max = [(min(L), max(L)) for L in (xs, ys)]
print(x_min_max, y_min_max) # -> (0, 9) (0, 9)
它的格式是(X,Y),在这里我想得到这个列表中所有X和Y的最大值和最小值
它应该是最小(X)=0,最大(X)=9,最小(Y)=0,最大(Y)=9
但是,当我这样做时:
min(listoftuples)[0], max(listoftuples)[0]
min(listoftuples)[1], max(listoftuples)[1]
…对于Y值,显示的最大值为3,这是不正确的
为什么呢
对于Y值,显示的最大值为3
因为max(listoftuples)
返回元组(9,3)
,所以max(listoftuples)[0]
是9
,max(listoftuples)[1]
是3
默认情况下,根据第一个索引的值,然后是第二个索引的值,依此类推,对iterables进行排序/比较
如果要在第二个索引中查找具有最大值的元组,则需要使用键
函数:
from operator import itemgetter
li = [(0, 0), (3, 0), ... ]
print(max(li, key=itemgetter(1)))
# or max(li, key=lambda t: t[1])
输出
(3, 9)
对于Y值,显示的最大值为3
因为max(listoftuples)
返回元组(9,3)
,所以max(listoftuples)[0]
是9
,max(listoftuples)[1]
是3
默认情况下,根据第一个索引的值,然后是第二个索引的值,依此类推,对iterables进行排序/比较
如果要在第二个索引中查找具有最大值的元组,则需要使用键
函数:
from operator import itemgetter
li = [(0, 0), (3, 0), ... ]
print(max(li, key=itemgetter(1)))
# or max(li, key=lambda t: t[1])
输出
(3, 9)
下面是一个使用列表理解的简单方法:
min([arr[i][0] for i in range(len(arr))])
max([arr[i][0] for i in range(len(arr))])
min([arr[i][1] for i in range(len(arr))])
max([arr[i][1] for i in range(len(arr))])
在这段代码中,我使用列表理解创建了一个包含所有X和Y值的列表,然后找到了每个列表的最小值/最大值。这会产生你想要的答案
前两行表示X值,后两行表示Y值。下面是一种使用列表理解的简单方法:
min([arr[i][0] for i in range(len(arr))])
max([arr[i][0] for i in range(len(arr))])
min([arr[i][1] for i in range(len(arr))])
max([arr[i][1] for i in range(len(arr))])
在这段代码中,我使用列表理解创建了一个包含所有X和Y值的列表,然后找到了每个列表的最小值/最大值。这会产生你想要的答案
前两行表示X值,后两行表示Y值。元组按其第一个值排序,如果是并列的,则按其第二个值排序(依此类推)。这意味着
max(listoftuples)
是(9,3)
。看
所以要找到最高的y值,你必须特别关注元组的第二个元素。一种方法是将列表拆分为x值和y值,如下所示:
[(0, 0), (3, 0), (3, 3), (0, 3), (0, 0), (0, 6), (3, 6), (3, 9), (0, 9), (0, 6), (6, 0), (9, 0), (9, 3), (6, 3), (6, 0), (0, 3), (3, 3), (3, 6), (0, 6), (0, 3)]
xs, ys = zip(*listoftuples)
x_min_max, y_min_max = [(min(L), max(L)) for L in (xs, ys)]
print(x_min_max, y_min_max) # -> (0, 9) (0, 9)
或者,如果你觉得这让人困惑,你可以用这个来代替,这大致相当于:
xs, ys = ([t[i] for t in listoftuples] for i in range(2))
然后获得他们的每一分和每一分,如下所示:
[(0, 0), (3, 0), (3, 3), (0, 3), (0, 0), (0, 6), (3, 6), (3, 9), (0, 9), (0, 6), (6, 0), (9, 0), (9, 3), (6, 3), (6, 0), (0, 3), (3, 3), (3, 6), (0, 6), (0, 3)]
xs, ys = zip(*listoftuples)
x_min_max, y_min_max = [(min(L), max(L)) for L in (xs, ys)]
print(x_min_max, y_min_max) # -> (0, 9) (0, 9)
另一种方法是将
listoftuples
作为矩阵处理
import numpy as np
a = np.array(listoftuples)
x_min_max, y_min_max = [(min(column), max(column)) for column in a.T]
print(x_min_max, y_min_max) # -> (0, 9) (0, 9)
(可能有一种更为惯用的方法来实现这一点,但我对NumPy不太熟悉。)元组按第一个值排序,如果是并列的,则按第二个值排序(依此类推)。这意味着
max(listoftuples)
是(9,3)
。看
所以要找到最高的y值,你必须特别关注元组的第二个元素。一种方法是将列表拆分为x值和y值,如下所示:
[(0, 0), (3, 0), (3, 3), (0, 3), (0, 0), (0, 6), (3, 6), (3, 9), (0, 9), (0, 6), (6, 0), (9, 0), (9, 3), (6, 3), (6, 0), (0, 3), (3, 3), (3, 6), (0, 6), (0, 3)]
xs, ys = zip(*listoftuples)
x_min_max, y_min_max = [(min(L), max(L)) for L in (xs, ys)]
print(x_min_max, y_min_max) # -> (0, 9) (0, 9)
或者,如果你觉得这让人困惑,你可以用这个来代替,这大致相当于:
xs, ys = ([t[i] for t in listoftuples] for i in range(2))
然后获得他们的每一分和每一分,如下所示:
[(0, 0), (3, 0), (3, 3), (0, 3), (0, 0), (0, 6), (3, 6), (3, 9), (0, 9), (0, 6), (6, 0), (9, 0), (9, 3), (6, 3), (6, 0), (0, 3), (3, 3), (3, 6), (0, 6), (0, 3)]
xs, ys = zip(*listoftuples)
x_min_max, y_min_max = [(min(L), max(L)) for L in (xs, ys)]
print(x_min_max, y_min_max) # -> (0, 9) (0, 9)
另一种方法是将
listoftuples
作为矩阵处理
import numpy as np
a = np.array(listoftuples)
x_min_max, y_min_max = [(min(column), max(column)) for column in a.T]
print(x_min_max, y_min_max) # -> (0, 9) (0, 9)
(可能有一种更为惯用的方法来实现这一点,但我对NumPy不太熟悉。)或者,更简单的是,
min(a[0]表示in-arr)
,min(a[1]表示in-arr)
,等等。实际上,无论何时编写范围(len(xxx))
,都有更好的方法。或者,更简单的是,min(a[0]表示in-arr)
,min(a[1]表示in-arr)
,等等。实际上,无论何时编写范围(len(xxx))
,都有更好的方法。将max
应用于元组只需返回其中的最大值。例如,max((0,9))
是9
。因此,将max
应用于元组列表只会返回具有最大值的元组。这并不能解释问题。问题的根源,如下所述,是当您对元组列表排序时,它首先按第一个元素排序,然后按下一个元素排序。因此,max((01111),(9,3))生成(01111),因为0首先排序。@Kris“所以对元组列表应用max
只会返回值最大的元组。”--不,这是不正确的。@Timmax((01111),(9,3))
->(9,3)
。也许你的意思是min
?@wjandrea道歉,没错。我忘记了排序的顺序。对元组应用max
只会返回其中的最大值。例如,max((0,9))
是9
。因此,将max
应用于元组列表只会返回具有最大值的元组。这并不能解释问题。问题的根源,如下所述,是当您对元组列表排序时,它首先按第一个元素排序,然后按下一个元素排序。因此,max((01111),(9,3))生成(01111),因为0首先排序。@Kris“所以对元组列表应用max
只会返回值最大的元组。”--不,这是不正确的。@Timmax((01111),(9,3))
->(9,3)
。也许你的意思是min
?@wjandrea道歉,没错。我忘了这类东西的顺序了。