了解lambda函数排序

时间:2018-09-13 16:00:34

标签: python-3.x dictionary lambda

我正在解决Python中的一些问题,我不知道如何解决,所以我在解决方案中查找并看到了lambda的用法,我知道它是如何工作的,但是这里的理解太复杂了,可以请有人解释我怎么回事?

在示例中,我们有以下内容:

d = {'000000000': 156, '255000000': 228, '255255255': 228, '000255000': 228}
return sorted(d.items(),key=lambda x: (-x[1],x[0]))[0][0] 

返回:000255000

还有:

d = {(0, 0, 0): 156, (255, 0, 0): 228, (255, 255, 255): 228, (0, 255, 0): 228}
return sorted(d.items(),key=lambda x: (-x[1],x[0][0],x[0][1],x[0][2]))[0][0]  

它返回:(0, 255, 0)

2 个答案:

答案 0 :(得分:0)

>>> sorted(d.items(),key=lambda x: (-x[1],x[0]))

返回此

[('000255000', 228), ('255000000', 228), ('255255255', 228), ('000000000', 156)]

基本上,它只是通过将键和值视为元组(-值,键)来对键进行排序。

答案 1 :(得分:0)

要理解这样的代码,请将其拆分为各个组件,并查看获得的单个结果。这样,您就可以遵循代码的哪一部分做什么,您将能够更轻松地理解它:

>>> d = {'000000000': 156, '255000000': 228, '255255255': 228, '000255000': 228}
>>> key = lambda x: (-x[1],x[0])
>>> for x in d.items(): print(x, key(x))

('000000000', 156) (-156, '000000000')
('255000000', 228) (-228, '255000000')
('255255255', 228) (-228, '255255255')
('000255000', 228) (-228, '000255000')

因此d.items()显然遍历了字典的键值对。 lambda是一个函数,当用该键值对调用时,它返回一个转换后的值。

然后使用该值对结果进行排序:

>>> result = sorted(d.items(),key=key)
>>> for x in result: print(x)

('000255000', 228)
('255000000', 228)
('255255255', 228)
('000000000', 156)

由于key函数仅用于对项目进行排序,因此结果的实际项目仍然是字典的原始键值对。

然后第一个[0]从结果中获取第一个项目,即最小的项目。第二个[0]从该键值元组获取 key

>>> result[0]
('000255000', 228)
>>> result[0][0]
'000255000'

在第二个示例中,发生了同样的事情。只是关键功能有点复杂:

>>> d = {(0, 0, 0): 156, (255, 0, 0): 228, (255, 255, 255): 228, (0, 255, 0): 228}
>>> key = lambda x: (-x[1],x[0][0],x[0][1],x[0][2])
>>> for x in d.items(): print(x, key(x))

((0, 0, 0), 156) (-156, 0, 0, 0)
((255, 0, 0), 228) (-228, 255, 0, 0)
((255, 255, 255), 228) (-228, 255, 255, 255)
((0, 255, 0), 228) (-228, 0, 255, 0)