【问题标题】:Getting the correct max value from a list of tuples从元组列表中获取正确的最大值
【发布时间】:2021-03-12 22:00:52
【问题描述】:

我的元组列表如下所示:

[(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)]

它的格式为 (X, Y),我想在其中获取此列表中所有 X 和 Y 的最大值和最小值。

应该是 min(X)=0, max(X)=9, min(Y)=0, max(Y)=9

但是,当我这样做时:

min(listoftuples)[0], max(listoftuples)[0]
min(listoftuples)[1], max(listoftuples)[1]

...对于 Y 值,显示的最大值为 3,这是不正确的。

为什么会这样?

【问题讨论】:

  • max 应用于一个元组只会返回其中的最大值。例如,max((0,9))9。因此,将max 应用于元组列表只会返回具有最大值的元组。
  • 这并不能解释问题。如下所述,问题的根源在于,当您对元组列表进行排序时,它首先按第一个元素排序,然后按下一个元素排序。所以, max(((0,1111),(9,3))) 产生 (0,1111) 因为 0 排在第一位。
  • @Kris “因此,将max 应用于元组列表只会返回具有最大值的元组。” -- 不,这是不正确的。
  • @Tim max(((0,1111),(9,3))) -> (9, 3)。也许你的意思是min
  • @wjandrea 抱歉,这是正确的。我忘记了排序的顺序。

标签: python python-3.x list tuples


【解决方案1】:

对于 Y 值,显示的最大值为 3

因为max(listoftuples)返回元组(9, 3),所以max(listoftuples)[0]9max(listoftuples)[1]3

默认情况下,iterables 根据第一个索引的值排序/比较,然后是第二个索引的值,依此类推。

如果要在第二个索引中找到最大值的元组,需要使用key函数:

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)

【讨论】:

    【解决方案2】:

    这是使用列表推导的一种简单方法:

    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(a[0] for a in arr)min(a[1] for a in arr) 等。几乎任何时候你写range(len(xxx)),都有更好的方法。
    【解决方案3】:

    元组按它们的第一个值排序,然后在平局的情况下,按它们的第二个值排序(依此类推)。这意味着max(listoftuples)(9, 3)。见How does tuple comparison work in Python?

    所以要找到最高的 y 值,您必须专门查看元组的 第二个元素。一种方法是将列表拆分为 x 值和 y 值,如下所示:

    xs, ys = zip(*listoftuples)
    

    或者,如果您觉得这令人困惑,您可以使用它来代替,它大致等效:

    xs, ys = ([t[i] for t in listoftuples] for i in range(2))
    

    然后获取他们的每个最小值和最大值,如下所示:

    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)
    

    另一种方法是使用NumPylistoftuples 视为矩阵。

    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 不是很熟悉。)

    【讨论】:

      猜你喜欢
      • 2018-08-27
      • 2020-05-19
      • 1970-01-01
      • 2019-04-04
      • 2022-11-01
      • 1970-01-01
      • 2018-02-12
      • 2011-11-27
      • 1970-01-01
      相关资源
      最近更新 更多