将元组列表映射到字典,python

whe*_*ies 4 python dictionary tuples list

我有一个从数据库中的表中提取的元组列表,它们看起来像(,,).key和foreignkeys之间有多对一的关系,我想将它转换为由foreignkey索引的dict,其中包含所有值与该外键的总和,即{ foreignkey,sumof ( value ) }.我写了一些相当冗长的东西:

myDict = {}
for item in myTupleList:
    if item[1] in myDict:
        myDict [ item[1] ] += item[2]
    else:
        myDict [ item[1] ] = item[2]
Run Code Online (Sandbox Code Playgroud)

但在看到这个问题的答案或者 两个问题之后,我必须更简洁地表达我想做的事情.如果这是重复,我错过了它,并将删除问题,如果你可以提供链接.

Chr*_*utz 8

假设您的所有值都是ints,您可以使用a defaultdict来简化:

from collections import defaultdict

myDict = defaultdict(int)

for item in myTupleList:
    myDict[item[1]] += item[2]
Run Code Online (Sandbox Code Playgroud)

defaultdict就像一个字典,除非你试图得到一个不在那里的密钥,它填充了callable返回的值 - 在这种情况下,int在没有参数的情况下调用时返回0.

更新:感谢@gnibbler提醒我,但是元组可以在for循环中解压缩:

from collections import defaultdict

myDict = defaultdict(int)

for _, key, val in myTupleList:
    myDict[key] += val
Run Code Online (Sandbox Code Playgroud)

这里,3项元组被解压缩到变量_key,和val._是Python中常见的占位符名称,用于表示该值不是很重要.利用这一点,我们才能避免长毛item[1]item[2]索引.如果元组中的元组myTupleList大小不同,我们就不能依赖于此,但我敢打赌它们是.

(我们还避免了某人查看代码并认为它​​被破坏的情况,因为编写者认为数组是1索引的,这是我第一次阅读代码时的想法.在我阅读这个问题之前,我没有对此进行缓解然而,在上面的循环中,很明显它myTupleList是三个元素的元组,我们只是不需要第一个元素.)


Joh*_*ooy 5

from collections import defaultdict

myDict = defaultdict(int)

for _, key, value in myTupleList:
    myDict[key] += value
Run Code Online (Sandbox Code Playgroud)