使用嵌套元组列表创建Python defaultdict

2024-04-18 18:18:25 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个二维列表。内部列表的每一项都是元组(键、值对)。键可能在列表中重复。从dict-2这样一个键的方式,把所有的值都存储在dict-2的默认值上。在

输入代码:

listOfItems = [[('a', 1), ('b', 3)], [('a', 6)], [('c', 0), ('d', 5), ('b', 2)]]
finalDict = defaultdict(int)
for eachItem in listOfItems:
    for key, val in eachItem:
        finalDict[key] += val
print(finalDict)

这正是我想要的:defaultdict(<class 'int'>, {'a': 7, 'b': 5, 'c': 0, 'd': 5})但是我正在寻找一种使用理解的更“python”方式。所以我尝试了以下方法:

^{pr2}$

但结果是:{'a': 6, 'b': 2, 'c': 0, 'd': 5}我做错了什么?还是说,在使用理解时,字典不是在动态中创建和修改的?在


Tags: key代码in列表for方式valdict
3条回答

这是因为你在理解中没有给你的结论赋予任何价值。在

在你的“理解”中,你实际上是在改变结局的类型

据我所知,你不能在理解中给你的口述赋予价值。在

这里有个方法可以得到你想要的单词

from functools import reduce

listOfItems = [[('a', 1), ('b', 3)], [('a', 6)], [('c', 0), ('d', 5), ('b', 2)]]

list_dict = [{key: val} for eachItem in listOfItems for key, val in eachItem]

def sum_dict(x, y):
    return {k: x.get(k, 0) + y.get(k, 0) for k in set(x) | set(y)}
print(reduce(sum_dict, list_dict))

不使用其他模块的简单解决方案:

inp_list = [[('a', 1), ('b', 3)], [('a', 6)], [('c', 0), ('d', 5), ('b', 2)]]

l = [item for sublist in inp_list for item in sublist] # flatten the list

sums = [(key, sum([b for (a,b) in l if a == key])) for key in dict(l)]

print(sums)

是的,一个理解是不能即时更新的。无论如何,此任务可能更适合使用.update()调用collections.Counter()

>>> from collections import Counter
>>> c = Counter()
>>> for eachItem in listOfItems:
...     c.update(dict(eachItem))
... 
>>> c
Counter({'a': 7, 'b': 5, 'd': 5, 'c': 0})

相关问题 更多 >