使用来自不同字典的选择值构建字典

时间:2016-10-08 05:27:49

标签: python dictionary iteration

我有一个词典,其中多年为键,其他词典为值(这些内部词典包含元组(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}

如果元组中的第一个数字大于或等于secondDictmyDict[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上完全迭代?有什么建议吗?

1 个答案:

答案 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)