2016-11-07 2 views
0

При инкапсуляции OrderedDict в dict возникает проблема, при которой OrderedDict не обновляется.Encapsulated OrderedDict in a Dict

Цель состоит в том, чтобы получить справочник с формой:

{name1: OrderedDict({year1:amount,year2:amount,...}), name2: OrderedDict({year1:amount,year2:amount,...})} 

Однако после инициализации первого temp_ord, он далее не обновляется и поэтому пары года сумма одинаковы для каждого имени после первой ,

CSV-структура в столбцах: название года номер. Я не уверен, что это ошибка цикла, или из-за инкапсуляции dicts.

import csv 
from collections import OrderedDict 

def plot_names(file_name, names): 
    temp_dict = {} 
    temp_ord = OrderedDict({}) 
    with open(file_name) as csvfile: 
     reader = csv.DictReader(csvfile) 
     for name in names: 
      for row in reader: 
       if name == row["name"]: 
        temp_ord[row["year"]] = row["number"] 
      temp_dict[name] = temp_ord 
    return temp_dict 

Формат данных:

year name gender number /n 1993 Abarna f 1 /n 1993 Abetare f 1 /n 1993 Abir f 1 
+0

Вы можете показать свои данные? –

+0

Обновлено. Вы видите все * последние * данные, потому что ** все они ссылаются на один и тот же объект **. Переместить 'temp_ord = OrderedDict()' (дополнительный словарь не нужен) * внутри цикла *. – jonrsharpe

+0

@jonrsharpe, в каком цикле точно вы могли бы установить фиксированные петли? – MtSummerbreeze

ответ

0

Проблема заключалась в том, что читатель может употребляться только один раз (спасибо @jonrsharpe).

import csv 
from collections import OrderedDict 

def plot_names(file_name, names): 
    temp_dict = {} 
    for name in names: 
      with open(file_name) as csvfile: 
       reader = csv.DictReader(csvfile) 
       temp_ord = OrderedDict({}) 
       for row in reader: 
        if name == row["name"]: 
         temp_ord[row["year"]] = row["number"] 
       temp_dict[name] = temp_ord 
    return temp_dict 
Смежные вопросы