我有一个要排序的元组列表。元组包含字符串:
connectionsList = [('C', 'B'), ('A', 'C'), ('D', 'B'), ('C','D')]
元组中的字符串将数值存储在字典中:
valuesDict = {'A':3, 'B':5, 'C':1, 'D':2}
我想做的是根据元组字典中值的总和对列表进行排序。这个玩具示例的期望输出是:
[(C,D), (A,C), (C,B), (D,B)]
总和为:
[3, 4, 6, 7]
使用 itemgetter,我可以按位置按字母顺序排序:
sortedView = sorted(connectionsList, key=itemgetter(0,1))
但是,我无法在 dict 中查找 itemgetter 的值。运行这个:
sortedView = sorted(connectionsList, key=valuesDict[itemgetter(0)] + valuesDict[itemgetter(1)])
给出 KeyError: operator.itemgetter(0) 的字典错误。
如何根据 dict 中的值创建排序?
请您参考如下方法:
不要使用itemgetter实例;你需要给他们打电话,但他们在这里太过分了。
只需使用传递到 lambda 中的 key 值直接访问字典。它是一个元组,所以添加索引:
sortedView = sorted(connectionsList, key=lambda k: valuesDict[k[0]] + valuesDict[k[1]])
key 参数必须是一个可调用对象,它接受一个参数(被排序的项目之一),并返回您实际排序的值。 itemgetter() 根据您调用它的对象的索引返回结果; itemgetter(0)(some_tuple) 将从传入的元组中返回第一个元素。
lambda 可以做同样的事情,在上面的解决方案中,lambda 返回给定元组所需的总和。
演示:
>>> connectionsList = [('C', 'B'), ('A', 'C'), ('D', 'B'), ('C','D')]
>>> valuesDict = {'A':3, 'B':5, 'C':1, 'D':2}
>>> sorted(connectionsList, key=lambda k: valuesDict[k[0]] + valuesDict[k[1]])
[('C', 'D'), ('A', 'C'), ('C', 'B'), ('D', 'B')]
您还可以将元组视为任意长度的序列。如果您还考虑到并非元组中的所有值都是 valuesDict 映射的有效键的可能性(取而代之的是 0),您还可以通过以下方式获得解决方案:
sortedView = sorted(connectionsList, key=lambda k: sum(valuesDict.get(v, 0) for v in k))
这更通用、更健壮。
您也不需要在按字母顺序排序时使用 itemgetter() 对象;元组已按 0, 1 顺序提供,因此您无需使用排序键即可获得相同的排序顺序。
