我有一份清单。每个条目都是另一个带有条目的列表,一个是节点的名称,另一个条目是相应的节点权重。
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
,您有两个条目0
和1
,1
是权重列表,所以我将其赋予sum
函数如此排序,但它给了我错误的答案。
答案 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
。