使用 min() 基于无序比较比较列表



我有一个列表列表,例如q = [[1,2],[3,4]],其中每个子列表都是 2 个整数的列表,我返回每个极值点的索引(我认为?

我需要的是子列表的所有第二个条目中第二个条目中具有最小/最大值的列表索引,

并且在第二个条目中有具有相同值的其他子列表时,返回最小/最大第二值条目列表中具有最小/最大第一个值的索引。

例如,如果q = [[1, 2], [3, 4], [1, 0], [0, 5]],我需要最小秒,如果平局,则分钟秒,然后第一。 所以我需要min(S)才能返回[1,0]. 相反,它似乎返回的是[0,5] .

>>> q = [[1,2],[3,4]]
>>> min(q)
[1, 2]
>>> q.append([1,0])
>>> min(q)
[1, 0]
>>> q.append([0,5])
>>> min(q)
[0, 5]
>>> q
[[1, 2], [3, 4], [1, 0], [0, 5]]

根据这里的这个答案,比较列表按元素顺序比较它们,使用下一个列表条目进行决胜。

>>> q.append([0,6])
>>> q.append([0,4])
>>> min(q)
[0, 4]
>>> q
[[1, 2], [3, 4], [1, 0], [0, 5], [0, 6], [0, 4]]
>>> 

有什么方法可以控制比较中的顺序吗? 我尝试通读文档,但我不明白我在读什么。

使用 [ min() ](1]) 的 key 关键字参数:

例:

>>> from operator import itemgetter
>>> q = [[1, 2], [3, 4], [1, 0], [0, 5]]
>>> min(q, key=itemgetter(1, 0))
[1, 0]

这将按键函数itemgetter(1, 0)对可迭代q进行排序,该键函数基本上返回(2nd-item, 1st-item)tuple,并且等效于min(q, key=lambda x: (x[1], x[0]))

min(iterable[, key]) min(arg1, arg2, *args[, key]) \

返回可迭代对象中最小的项或两个或多个参数中的最小项。

如果提供了一个位置参数,则可迭代参数必须是非空的 可迭代(例如非空字符串、元组或列表)。最小的 返回可迭代对象中的项。如果两个或多个位置参数 提供,返回最小的位置参数。

可选键参数指定单参数排序函数 就像用于list.sort()一样。如果提供关键参数,则必须是 关键字形式(例如,min(a,b,c,key=func))。

在 2.5 版更改: 添加了对可选键参数的支持。

这对你有用吗?

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

您可以使用扩展切片语法来反转子列表:

>>> q = [[1, 2], [3, 4], [1, 0], [0, 5]]
>>> min(q, key=lambda sl: sl[::-1])
[1, 0]

最新更新