我有一个词典,其中多年为键,其他词典为值(这些内部词典包含元组(i,i + 1)作为键)。格式的一个例子是:
myDict = {2000: {(0,1):111.1, (1,2):222.2, (2,3):333.3, (3,4):444.4}
2001: {(0,1):11.1, (1,2):22.2, (2,3):33.3, (3,4):44.4}}
从这本字典中,我正在尝试编写一个字典secondDict
,它也有多年的密钥。对于某些元组(即第0个索引大于1的那一年中的任何元组),值将是myDict
中最内层值的总和。我想要的是一本看起来像这样的字典:
secondDict = {2000: 777.7, 2001: 77.7}
如果元组中的第一个数字大于或等于secondDict
,myDict[2000][tuple]
中的值将是2
中值的总和。
到目前为止,我有:
years = [2000, 2001, 2002, 2003, 2011, 2012, 2013, 2014]
tuples = [(i, i+1) for i in range(65)]
for year in years:
for key in myDict[year]:
for value in myDict[year][key]:
if key[0] >= 30:
secondDict[year] += value
我的方法有几个问题,但是想不出另一种构建字典的方法。
1)首先,我为循环的第三行(TypeError: 'float' object is not iterable
...)得到for value in
。我试图访问的所有值都是浮点数,所以我不知道如何解决这个问题。
2)继续讨论我预期但由于TypeError
而无法解决的问题:在行if key[0] >= 30
中我试图访问元组的第0个索引;这会有效吗?如果没有,我该如何访问它?
3)我在这里使用一些相当大的字典,看起来这个循环的运行时间会很慢;但是我对编码很陌生,所以我对此的把握是有限的。每个循环只是 O(n),即 O(n ^ 4),因为有四个循环?如何创建更好,更快的算法来构建这样的字典?
修改 的
经过更多研究和一些代码验证,我现在有了:
for year in years:
for key in myDict[year].keys():
if key[0] >= 30:
secondDict[year] += myDict[year][key]
这不会引起任何错误,但在打印时我发现它只编译了一年:
In[5]: secondDict
Out[5]:
defaultdict(None,
{2000: 0,
2001: 0,
2002: 0,
2003: 27162828.602349777,
2011: 0,
2012: 0,
2013: 0,
2014: 0})
为什么不在years
上完全迭代?有什么建议吗?
答案 0 :(得分:1)
这是一个dict理解,执行你在问题开始时指定的动作,即,对于第0个索引大于1的元组,值是let currentDate = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy hh:mm:ss a"
let convertedDate: String = dateFormatter.string(from: currentDate) //08/10/2016 01:42:22 AM
中最内层值的总和。
myDict
<强>输出强>
myDict = {
2000: {(0,1):111.1, (1,2):222.2, (2,3):333.3, (3,4):444.4},
2001: {(0,1):11.1, (1,2):22.2, (2,3):33.3, (3,4):44.4},
}
secondDict = {y: sum(v for t, v in d.items() if t[0] > 1)
for y, d in myDict.items()}
print(secondDict)