【问题标题】:Build a dictionary using select values from a different dictionary使用来自不同字典的选择值构建字典
【发布时间】:2016-10-08 05:27:48
【问题描述】:

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

如果元组中的第一个数字大于或等于2,则secondDict 中的值将是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) 首先,我得到一个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?有什么建议吗?

【问题讨论】:

  • any interval in that year whose 1st index is greater than 30)是什么意思
  • 抱歉让您感到困惑。我想访问myDict(元组)的内部键,并仅提取具有足够高值的那些元组(我认为它们是间隔)的值。因此,例如,如果myDict[2000] 有键(28, 29), (29, 30), (30, 31), (31, 32),我想提取(30, 31) and (31, 32) 下的值,而不是(28,29) and (29,30)。我会回去尝试更好地表达它
  • 但是在上面的问题中,没有一个元组值是>30 所以答案怎么会是777.7
  • 这只是一个错字。实际字典很长,所以我在我的问题中给出了一个精简版本 - 出现不一致是因为 30 是我试图在我的实际字典中使用的截断。实际的字典有 2000-2003 年和 2011-2014 年,i 的元组 (i, i+1) 从 0 到 64。我试图在我的编辑中更好地澄清

标签: python dictionary iteration


【解决方案1】:

这是一个 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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2015-07-06
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多