Python 从dict中的itemgetter查找值

Python 从dict中的itemgetter查找值,python,sorting,dictionary,tuples,Python,Sorting,Dictionary,Tuples,我有一个元组列表,我正在尝试排序。元组包含字符串: connectionsList = [('C', 'B'), ('A', 'C'), ('D', 'B'), ('C','D')] 元组中的字符串具有存储在dict中的数值: valuesDict = {'A':3, 'B':5, 'C':1, 'D':2} 我想做的是根据dict中元组的值之和对列表进行排序。此玩具示例的期望输出为: [(C,D), (A,C), (C,B), (D,B)] 其总金额为: [3, 4, 6, 7] 使用

我有一个元组列表,我正在尝试排序。元组包含字符串:

connectionsList = [('C', 'B'), ('A', 'C'), ('D', 'B'), ('C','D')]
元组中的字符串具有存储在dict中的数值:

valuesDict = {'A':3, 'B':5, 'C':1, 'D':2}
我想做的是根据dict中元组的值之和对列表进行排序。此玩具示例的期望输出为:

[(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的dict错误:operator.itemgetter0

如何基于dict中的值创建排序?

不要使用itemgetter实例;你需要打电话给他们,但他们在这里太过分了

只需使用传入lambda的键值直接访问字典。它是一个元组,因此添加索引:

sortedView = sorted(connectionsList, key=lambda k: valuesDict[k[0]] + valuesDict[k[1]])
关键参数必须是一个可调用的对象,该对象接受一个参数(正在排序的项之一),并返回实际排序的值。itemgetter,它根据调用对象的索引返回结果;itemgetter0some\ tuple将从传入的元组返回第一个元素

lambda也可以这样做,在上面的解决方案中,lambda返回给定元组所需的和

演示:

您还可以将元组视为任意长度的序列。如果还考虑到并非元组中的所有值都是valuesDict映射的有效键(取而代之为0),则还可以通过以下方法获得解决方案:

sortedView = sorted(connectionsList, key=lambda k: sum(valuesDict.get(v, 0) for v in k))
这是一个更通用、更健壮的方法

您也不需要在字母排序中使用itemgetter对象;元组已经以0,1的顺序提供,因此您可以在不使用排序键的情况下获得相同的排序顺序。

不要使用itemgetter实例;你需要打电话给他们,但他们在这里太过分了

只需使用传入lambda的键值直接访问字典。它是一个元组,因此添加索引:

sortedView = sorted(connectionsList, key=lambda k: valuesDict[k[0]] + valuesDict[k[1]])
关键参数必须是一个可调用的对象,该对象接受一个参数(正在排序的项之一),并返回实际排序的值。itemgetter,它根据调用对象的索引返回结果;itemgetter0some\ tuple将从传入的元组返回第一个元素

lambda也可以这样做,在上面的解决方案中,lambda返回给定元组所需的和

演示:

您还可以将元组视为任意长度的序列。如果还考虑到并非元组中的所有值都是valuesDict映射的有效键(取而代之为0),则还可以通过以下方法获得解决方案:

sortedView = sorted(connectionsList, key=lambda k: sum(valuesDict.get(v, 0) for v in k))
这是一个更通用、更健壮的方法


您也不需要在字母排序中使用itemgetter对象;元组已按0、1的顺序提供,因此您可以在不使用排序键的情况下获得相同的排序顺序。

如果您想在valuesDict中查找键并使用itemgetter对它们求和,您必须执行以下操作:

>>> from operator import itemgetter

>>> connectionsList = [('C', 'B'), ('A', 'C'), ('D', 'B'), ('C','D')]
>>> valuesDict = {'A':3, 'B':5, 'C':1, 'D':2}

>>> idx = 0
>>> sum(itemgetter(*itemgetter(0, 1)(connectionsList[idx]))(valuesDict))
6
connectionsList[idx]是将传递给键函数的当前元素。因此,您需要对此进行转换,以便实际的键函数只需要当前元素作为参数:

>>> def keyfunc(cur_element):
...     return sum(itemgetter(*itemgetter(0, 1)(cur_element))(valuesDict))
>>> sorted(connectionsList, key=keyfunc)
[('C', 'D'), ('A', 'C'), ('C', 'B'), ('D', 'B')]
但是,与没有itemgetter的解决方案相比,这不是真正可读的:

因此,在这种情况下,您可能不应该使用itemgetter,因为它涉及更多的函数调用,并且生成的函数不是很好

如果ValuesDictionary中可能缺少某些键,则应将[]循环替换为get调用:


注意:当普通def函数变得更复杂时,我通常更喜欢普通def函数而不是lambda函数,但这是一个品味问题。在这种情况下,很容易将它们转换为lambdas。

如果您想在valuesDict中查找键并使用itemgetter对它们求和,则必须执行以下操作:

>>> from operator import itemgetter

>>> connectionsList = [('C', 'B'), ('A', 'C'), ('D', 'B'), ('C','D')]
>>> valuesDict = {'A':3, 'B':5, 'C':1, 'D':2}

>>> idx = 0
>>> sum(itemgetter(*itemgetter(0, 1)(connectionsList[idx]))(valuesDict))
6
connectionsList[idx]是将传递给键函数的当前元素。因此,您需要对此进行转换,以便实际的键函数只需要当前元素作为参数:

>>> def keyfunc(cur_element):
...     return sum(itemgetter(*itemgetter(0, 1)(cur_element))(valuesDict))
>>> sorted(connectionsList, key=keyfunc)
[('C', 'D'), ('A', 'C'), ('C', 'B'), ('D', 'B')]
但是,与没有itemgetter的解决方案相比,这不是真正可读的:

因此,在这种情况下,您可能不应该使用itemgetter,因为它涉及更多的函数调用,并且生成的函数不是很好

如果ValuesDictionary中可能缺少某些键,则应将[]循环替换为get调用:


注意:当普通def函数变得更复杂时,我通常更喜欢普通def函数而不是lambda函数,但这是一个品味问题。在这种情况下,很容易将它们转换为lambdas。

您可以尝试以下方法:

>>> from operator import itemgetter

>>> connectionsList = [('C', 'B'), ('A', 'C'), ('D', 'B'), ('C','D')]
>>> valuesDict = {'A':3, 'B':5, 'C':1, 'D':2}

>>> idx = 0
>>> sum(itemgetter(*itemgetter(0, 1)(connectionsList[idx]))(valuesDict))
6
首先收集列表中的总和和元组:

connectionsList = [('C', 'B'), ('A', 'C'), ('D', 'B'), ('C','D')]

valuesDict = {'A':3, 'B':5, 'C':1, 'D':2}


tuple_sum=[]
for i in connectionsList:
    tuple_sum.append((valuesDict.get(i[0])+valuesDict.get(i[1]),i))
它将提供:

[(6, ('C', 'B')), (4, ('A', 'C')), (7, ('D', 'B')), (3, ('C', 'D'))]
现在对其进行排序并仅获取嵌套元组:

print(list(map(lambda x:x[1],sorted(tuple_sum))))
输出:

[('C', 'D'), ('A', 'C'), ('C', 'B'), ('D', 'B')]

您可以尝试以下方法:

>>> from operator import itemgetter

>>> connectionsList = [('C', 'B'), ('A', 'C'), ('D', 'B'), ('C','D')]
>>> valuesDict = {'A':3, 'B':5, 'C':1, 'D':2}

>>> idx = 0
>>> sum(itemgetter(*itemgetter(0, 1)(connectionsList[idx]))(valuesDict))
6
首先收集列表中的总和和元组:

connectionsList = [('C', 'B'), ('A', 'C'), ('D', 'B'), ('C','D')]

valuesDict = {'A':3, 'B':5, 'C':1, 'D':2}


tuple_sum=[]
for i in connectionsList:
    tuple_sum.append((valuesDict.get(i[0])+valuesDict.get(i[1]),i))
它将提供:< /p> 现在对其进行排序并仅获取嵌套元组:

print(list(map(lambda x:x[1],sorted(tuple_sum))))
输出:

[('C', 'D'), ('A', 'C'), ('C', 'B'), ('D', 'B')]

sortedconnectionsList,key=lambda x:sum[valuesDict[y]表示x中的y]?但是,您必须担心使用不存在的键进行索引。sortedconnectionsList,key=lambda x:sum[valuesDict[y]表示x中的y]?但是,您必须担心使用不存在的键进行索引。