Python lambda表达式没有达到预期的效果

时间:2015-05-25 00:59:02

标签: python lambda

我有一份清单。每个条目都是另一个带有条目的列表,一个是节点的名称,另一个条目是相应的节点权重。

l = [ [['A', 'C', 'B', 'D'], [2, 4, 3, 2]], [['E', 'F'], [3, 66]] ]

我想根据每个节点的权重总和按递减顺序对列表进行排序。因此,对于此示例,['E', 'F']条目将首先出现,因为3 + 66 > 2 + 4 + 3 + 2

我写了一个像这样的lambda表达式:

l.sort(key=lambda x: x if not x[1] else sum(x[1]))

但它没有给我正确的答案。对于x中的每个l,您有两个条目011是权重列表,所以我将其赋予sum函数如此排序,但它给了我错误的答案。

1 个答案:

答案 0 :(得分:5)

首先,sort方法从最小到最大排序。如果您想要相反,请使用reverse=True

其次,max函数返回最大值,而不是所有值的总和。如果您想要总和,请使用sum

第三,如果x为空,则回到x[1]似乎没有任何意义。如果没有权重,您希望将名称列表和空列表的列表视为权重之和?这可能是正确的。 * 也许你想把它当作0或大于所有数字的东西,或者......好吧,无论你想要什么,你都可以轻松地写出来。事实上,如果你想要的是0,那已经是sum的默认值。

因此,要按3 + 66 > 2 + 4 + 3 + 2隐含的顺序排序:

l.sort(key=lambda x: sum(x[1]), reverse=True)

例如:

>>> l = [[[], []], [['E', 'F'], [3, 66]], [[], []], [['A', 'C', 'B', 'D'], [2, 4, 3, 2]]]
>>> l.sort(key=lambda x: sum(x[1]), reverse=True)
>>> l
[[['E', 'F'], [3, 66]], [['A', 'C', 'B', 'D'], [2, 4, 3, 2]], [[], []], [[], []]]

* Python 2.x将为您真实地比较[[], []]0。该语言要求[[], []]大于所有数字,或小于所有数字。如果您正在使用CPython 2.7,它会更大,因为它自己特别的规则,你真的不想学习,绝对不想依赖这里。 Python 3.x将抵制做一些愚蠢的事情的诱惑,而只是提出一个TypeError