基于乱序比较将列表与min()进行比较

时间:2015-06-10 04:42:08

标签: python list min

我有一个列表列表,例如q = [[1,2],[3,4]],其中每个子列表是2个整数的列表,我返回每个extreme point的索引(我想?)。

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

例如,如果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]]

根据this answer here,比较列表按照元素的顺序对它们进行比较,使用下一个列表条目进行打击。

>>> 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]]
>>> 

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

3 个答案:

答案 0 :(得分:2)

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

示例:

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

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

  

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

     

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

     

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

     

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

     

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

答案 1 :(得分:1)

这对你有用吗?

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

答案 2 :(得分:1)

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

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