我有一个列表列表,例如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,但我不明白我在读什么。
答案 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]