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

2024-09-29 17:13:09 发布

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

我有一个字典,其中年份作为键,其他字典作为值(这些内部字典包含元组(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,这本词典中的键也有年份。这些值将是myDict中仅针对特定元组(即该年中第0个索引大于1的任何元组)的最内层值的总和。我想要的是一本这样的字典:

secondDict = {2000: 777.7, 2001: 77.7}

如果元组中的第一个数字大于或等于2secondDict中的值将是myDict[2000][tuple]中的值的总和

到目前为止,我已经:

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)首先,我得到循环第三行(for value in…)的TypeError: 'float' object is not iterable。我尝试访问的所有值都是浮点数,所以我不知道如何解决这个问题

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上完全迭代?有什么建议吗


Tags: keyinforif字典valueyearmydict
1条回答
网友
1楼 · 发布于 2024-09-29 17:13:09

下面是一个dict理解,它执行您在问题开始时指定的操作,即,对于第0个索引大于1的元组,值是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)

输出

{2000: 777.7, 2001: 77.69999999999999}

相关问题 更多 >

    热门问题