【发布时间】: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