基于乱序比较将列表与 min() 进行比较
Comparing lists with min() based on out of order comparisons
我有一个列表列表,例如 q = [[1,2],[3,4]]
,其中每个子列表都是 2 个整数的列表,我 return 每个 extreme point 的索引(我觉得?)。
我需要的是列表的索引,在子列表的所有第二个条目中的第二个条目中具有 min/max 值,并且第二个条目中还有其他具有相同值的子列表,min/max 第二个值条目列表中第一个值 min/max 的索引是 returned.
例如,如果q = [[1, 2], [3, 4], [1, 0], [0, 5]]
,我需要分秒,如果平局,则分秒然后是第一。所以我需要min(S)
到return[1,0]
。相反,在 return 看来是 [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,但我不明白我在读什么。
这对你有用吗?
min(q, key = lambda x: (x[1],x[0]))
使用[min()
]的key
关键字参数(1]:
示例:
>>> 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
进行排序,它基本上是 returns 一个 (2nd-item, 1st-item)
的 tuple
并且等价于 min(q, key=lambda x: (x[1], x[0]))
.
min(iterable[, key])
min(arg1, arg2, *args[, key])
\
Return the smallest item in an iterable or the smallest of two or more arguments.
If one positional argument is provided, iterable must be a non-empty
iterable (such as a non-empty string, tuple or list). The smallest
item in the iterable is returned. If two or more positional arguments
are provided, the smallest of the positional arguments is returned.
The optional key argument specifies a one-argument ordering function
like that used for list.sort(). The key argument, if supplied, must be
in keyword form (for example, min(a,b,c,key=func)).
Changed in version 2.5: Added support for the optional key argument.
您可以使用扩展切片语法来反转子列表:
>>> q = [[1, 2], [3, 4], [1, 0], [0, 5]]
>>> min(q, key=lambda sl: sl[::-1])
[1, 0]
我有一个列表列表,例如 q = [[1,2],[3,4]]
,其中每个子列表都是 2 个整数的列表,我 return 每个 extreme point 的索引(我觉得?)。
我需要的是列表的索引,在子列表的所有第二个条目中的第二个条目中具有 min/max 值,并且第二个条目中还有其他具有相同值的子列表,min/max 第二个值条目列表中第一个值 min/max 的索引是 returned.
例如,如果q = [[1, 2], [3, 4], [1, 0], [0, 5]]
,我需要分秒,如果平局,则分秒然后是第一。所以我需要min(S)
到return[1,0]
。相反,在 return 看来是 [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,但我不明白我在读什么。
这对你有用吗?
min(q, key = lambda x: (x[1],x[0]))
使用[min()
]的key
关键字参数(1]:
示例:
>>> 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
进行排序,它基本上是 returns 一个 (2nd-item, 1st-item)
的 tuple
并且等价于 min(q, key=lambda x: (x[1], x[0]))
.
min(iterable[, key])
min(arg1, arg2, *args[, key])
\Return the smallest item in an iterable or the smallest of two or more arguments.
If one positional argument is provided, iterable must be a non-empty iterable (such as a non-empty string, tuple or list). The smallest item in the iterable is returned. If two or more positional arguments are provided, the smallest of the positional arguments is returned.
The optional key argument specifies a one-argument ordering function like that used for list.sort(). The key argument, if supplied, must be in keyword form (for example, min(a,b,c,key=func)).
Changed in version 2.5: Added support for the optional key argument.
您可以使用扩展切片语法来反转子列表:
>>> q = [[1, 2], [3, 4], [1, 0], [0, 5]]
>>> min(q, key=lambda sl: sl[::-1])
[1, 0]