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
只会返回值最大的元组。”--不,这是不正确的。@Tim
max((01111),(9,3))
->
(9,3)
。也许你的意思是
min
?@wjandrea道歉,没错。我忘记了排序的顺序。对元组应用
max
只会返回其中的最大值。例如,
max((0,9))
9
。因此,将
max
应用于元组列表只会返回具有最大值的元组。这并不能解释问题。问题的根源,如下所述,是当您对元组列表排序时,它首先按第一个元素排序,然后按下一个元素排序。因此,max((01111),(9,3))生成(01111),因为0首先排序。@Kris“所以对元组列表应用
max
只会返回值最大的元组。”--不,这是不正确的。@Tim
max((01111),(9,3))
->
(9,3)
。也许你的意思是
min
?@wjandrea道歉,没错。我忘了这类东西的顺序了。