Skip to main content
 首页 » 编程设计

python之从字典中的 itemgetter 查找值

2025年05月04日17kenshinobiy

我有一个要排序的元组列表。元组包含字符串:

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 顺序提供,因此您无需使用排序键即可获得相同的排序顺序。