2017-03-02 3 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 

. 내가 겪고있는 문제는 사전이 오직 1 년과 하나의 값 (마지막 것)을 포함한다는 것입니다. 따라서 consumption['United States'][1980]과 같은 것을 인쇄하려고하면 사전에 1980 년에 항목이 없기 때문에 2014 년에만 오류가 발생합니다.

나는 아주 간단한 것을 놓치고있는 것처럼 느껴지지만 그 위에는 내 손가락을 대지 못합니다. .

Here은 전체 CSV 파일입니다.

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

당신은 루프의 각 반복에 consumption[country]의 이전 값을 덮어 쓰기 :

+0

'split','country' 및'consumption'을 어떻게 선언하는지 보지 않고는 도울 수 없습니다. – Adirio

+0

더 많은 코드를 게시했습니다. – ninesalt

+1

팬더를 사용하지 않는 특별한 이유가 있습니까? 그게 훨씬 더 적절할거야 –

답변

2

문제는이와 그 것으로 보인다.

대신

,이 시도 : 사전 - 이해의

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

아, 멋지다. 그 우편 기능에 대해 몰랐다. 그렇다. 리셋은 의도적이다. 비록 당신의 솔루션이 효과가 있다는 것을 알고 있지만, 나는 아직도 그 값이 겹쳐 쓰여진 이유가 무엇인지 알아 내려고 노력하고 있습니다. – ninesalt

+0

@ Swailem95 네, 그 해는 독특 합니다만, 전체'소비 [country]'dict를 _overwrite_합니다. –