如何仅对二维列表的第一列使用 min()

How to use min() only with first column of 2-dimensional list

我有一个二维列表,其中每个条目都有一个时间戳 (int) 和第二个可以是 int、字符串或对象的值。

我正在使用 min() 函数获取具有最低时间戳的条目:

a = [[2, "start C"],
     [6, 2484],
     [15, "finish C"]]

print(min(a))

输出:

[2, 'start C']

当存在相同的最低时间戳时,min() 将比较这些项目的第二列。

这仅在第二列具有可比较的值时有效:

a = [[2, "start C"],
     [2, "start B"],
     [15, "finish C"]]

print(min(a))

输出:

[2, 'start B']

如果第二列包含不同的数据类型,则会引发错误:

a = [[2, "start C"],
     [2, 2484],
     [15, "finish C"]]

print(min(a))

输出:

TypeError: '<' not supported between instances of 'int' and 'str'

如何让只检查第一列的最小值? 当有相同的时间戳时,它应该只是 return 遇到的第一个项目。

你可以传递一个比较键

min(my_list, key=lambda x: x[0])

默认情况下,python 使用第一项进行比较,如果出现平局,则使用第二项作为决胜局(依此类推),这就是出现错误的原因。

min 接受一个 key 参数,可用于获得预期的行为:

from operator import itemgetter

a = [[2, "start C"],
     [6, 2484],
     [15, "finish C"]]

min(a, key=itemgetter(0))
# [2, 'start C']

这相当于在@blue_note的解决方案中使用自定义 lambda 函数对内部列表进行切片,但通常会更快一些(尽管这主要是一种习惯,因为在必须获取多个项目时更方便正如所解释的 here):

min(my_list, key=lambda x: x[0])

通过使用itemgetter,仅获取每个内部列表中的第一个元素进行排序,然后计算该子集中的最小值