我正在尝试创建一个嵌套的字典,该字典保留来自元组的总数。外键将是产品ID。嵌套字典将以月份和该月份发生的崩溃总数作为键。
示例:元组中的值是:(产品ID,日期,崩溃次数)
outages = [
('A','2018-01-01', 20),
('A','2018-01-01', 20),
('A','2018-01-01', 20),
('B','2018-01-15', 80),
('B','2018-01-19', 200),
('A','2018-02-08', 15),
('A','2018-02-09', 15),
('B','2018-02-15', 80),
('B','2018-02-15', 90),
('B','2018-02-20', 10),
('C','2018-02-25', 120),
('A','2018-03-01', 10),
('B','2018-04-01', 10),
('C','2018-03-01', 5)]
我的预期输出是:
{'A': {1: 60, 2: 30, 3: 10}, 'B': {1: 280, 2: 180, 4: 10}, 'C': {2: 120, 3: 5}}
这是我到目前为止的内容:
from datetime import datetime
#Create a class to implement missing method for when key is not in the dictionary
class NestedDict(dict):
def __missing__(self, key):
self[key] = NestedDict()
return self[key]
#Create Instance of NestedDict
nested_dic=NestedDict()
#Loop through outages and created outer and inner key
for x in outages:
nested_dic[x[0]][datetime.strptime(x[1], '%Y-%m-%d').month] = 0 #=>Need Help Here
我不确定从哪里可以得到所需的输出。我将值设置为0,因为执行:+= x[2]
而是给了我一个错误。理想情况下,我想outages
在扫描每个元组之后迭代并更新字典,而不必重复多次。
如果您不介意使用,可能会非常简洁collections.defaultdict
。这个想法是提取月份,将其转换为int
并在每个嵌套字典上累积:
from collections import defaultdict
outages_by_month = defaultdict(lambda: defaultdict(int))
for prod_id, date, crashes in outages:
outages_by_month[prod_id][int(date[5:7])] += crashes
print(outages_by_month)
如果您需要normal dict
s(NestedDict
感觉像是不必要的抽象),请从头开始以这种方式构建它们(手动设置默认键),或使用类似方法:
outages_by_month = {k: dict(v) for k, v in outages_by_month.items()}
结果:
{'A': {1: 60, 2: 30, 3: 10}, 'B': {1: 280, 2: 180, 4: 10}, 'C': {2: 120, 3: 5}}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句