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]?但是,您必须担心使用不存在的键进行索引。