2017-03-02 63 views
1

我有一个CSV文件,看起来像这样:enter image description here它显示从1980年到2014年4个国家的电力消耗。我试图创建一个嵌套字典,例如consumption['United States'][1980]将返回正确的值。我必须用整年的列表中的数组,我试图创建字典是这样的:循环中的嵌套字典

file = open('power dataset.csv', 'r') 

years = list(range(1980, 2015)) 

consumption = {} 
generation = {} 

generation = False 

for line in file: 

    if("Nuclear" in line): 
     break 

    split = line.split(",") 

    if split[0] == "Generation": 
     generation = True 

    if "Egypt" == split[0] or split[0] == "Germany" or split[0] == "Netherlands" or split[0] == "United States": 

     values = split[2:] 

     if not generation: 

      i = 0 

      for year in years: 
       country = split[0] 
       consumption[country] = {year: values[i]} 
       i = i+1 

其中值是包含相应年度的值的数组。我遇到的问题是字典最终只包含一年和一个值(这是最后一个)。所以如果我尝试打印像consumption['United States'][1980]这样的东西,我得到一个错误,因为1980年字典中没有条目,只有2014年。

我觉得我错过了一些相当简单的东西,但我无法完全放下手指。

Here是整个CSV文件。

+0

没有看到你如何声明'split','country'和'consumption'我们忍不住 – Adirio

+0

发表了更多的代码。 – ninesalt

+1

是不是有没有使用熊猫的特殊原因?这将是更合适 –

回答

2

这个问题似乎是与此:

for year in years: 
    consumption[country] = {year: values[i]} 

您覆盖在循环的每次迭代consumption[country]以前的值。

相反,试试这个:

if country in ("Egypt", "Germany", "Netherlands", "United States"): 
    if not generation: 
     consumption[country] = {year: vals for year, vals in zip(years, values)} 

步骤一步的字典理解的击穿例如与zip

>>> years = [1980, 1981, 1982, 1983] 
>>> values = [1, 2, 3, 4] 
>>> zip(years, values) 
[(1980, 1), (1981, 2), (1982, 3), (1983, 4)] 
>>> {year: vals for year, vals in zip(years, values)} 
{1980: 1, 1981: 2, 1982: 3, 1983: 4} 

或者,你可以在内环之前初始化consumption[country]consumption[country] = {}然后在编辑之前使用原始代码中的consumption[country][year] = values[i]

+0

你介意解释这是干什么吗?另外,如果年份总是不同,怎么会被覆盖? – ninesalt

+0

很酷,不知道那个zip函数 - 是的重置是故意的。虽然我知道你的解决方案是有效的,但我仍然试图弄清为什么值被覆盖,即使这些年份是独特的,它应该可以工作,但它不会。 – ninesalt

+0

@ Swailem95是的,这些年是独一无二的,但是你覆写了整个'消费'国家'字典。 –