2013-04-21 5 views
1

У меня есть следующий код:Как создать словарь в словаре

datedict = defaultdict(set) 
with open('d:/info.csv', 'r') as csvfile: 
    filereader = csv.reader(csvfile, 'excel') 

    #passing the header 
    read_header = False 
    start_date=date(year=2009,month=1,day=1) 
    #print((seen_date - start_date).days) 
    tdic = {} 
    for row in filereader: 
     if not read_header: 
      read_header = True 
      continue 

# reading the rest rows 
     name,id,firstseen = row[0],row[1],row[3] 
     try: 
      seen_date = datetime.datetime.strptime(firstseen, '%d/%m/%Y').date()    
      deltadays = (seen_date-start_date).days 
      deltaweeks = deltadays/7 + 1 
      key = name +'-'+id 
      currentvalue = tdic.get(key, []) 
      currentvalue.append(deltaweeks) 
      tdic[key] = currentvalue 

     except ValueError: 
      print('Date value error') 
      pass 

tdic = dict((name, max(weeks) - min(weeks) + 1) for name, weeks in tdic.iteritems()) 

pprint.pprint(tdic) 

, в котором я получаю результат ниже:

{'Mali-2': 20, 
'Gooki-3': 6, 
'Piata-4': 6,  
'Goerge-5': 4, 
'Samoo-6': 1, 
'Marria-7': 2} 

Теперь я хотел бы написать и напечатать эти три элемента, имя, id и недели как отдельные столбцы в файле excel. Кто-нибудь знает, как это возможно?

+0

Пожалуйста, исправьте свой результат, это неправда python. @ user2058811 Это ваш желаемый результат? Или это то, что у вас есть? Он все еще недействителен Python ... – jamylak

+0

Вы сказали, что хотите распечатать их в файле excel, мой ответ просто распечатывает их напрямую, это прекрасно? – jamylak

+0

, который не был частью вашего первоначального вопроса, я предлагаю открыть новый – jamylak

ответ

3
>>> with open('out.csv', 'w') as f: 
     w = csv.writer(f) 
     for k, v in tdic.iteritems(): 
      name, id_ = k.split('-') 
      weeks = v 
      w.writerow([name, id_, weeks]) 


>>> with open('out.csv') as f: 
     print f.read() 


Piata,4,6  
Mali,2,20  
Goerge,5,4  
Gooki,3,6  
Samoo,6,1  
Marria,7,2 

Я, однако, не нравится, как вы сделали это , вот несколько предложений для вашего кода:

key = name +'-'+id 

Вместо того, чтобы использовать манипуляции со строками для создания ключа, используйте tuple:

key = (name, id) 

Изменить эту строку:

tdic = dict((name, max(weeks) - min(weeks) + 1) for name, weeks in tdic.iteritems()) 

просто сказать

tdic = dict((key, max(weeks) - min(weeks) + 1) for key, weeks in tdic.iteritems()) 

так как теперь это ключ (name, id_) мы должны отразить это (это незначительная вещь, но важная)

Тогда вышеуказанный код будет просто

>>> with open('out.csv', 'w') as f: 
     w = csv.writer(f) 
     for (name, id_), weeks in tdic.iteritems(): 
      w.writerow([name, id_, weeks]) 
+0

@ user2058811 oops Я имел в виду 'tdic.iteritems()' not 'd.iteritems()'. Также не могли бы вы вывести вывод «print tdic» – jamylak

+0

@ user2058811 Измените расширение файла на '.csv', которое можно открыть с помощью excel – jamylak

+0

@ user2058811 Что вы имеете в виду? Что такое '.cvs'? – jamylak

1

Вы можете определить Dict в Словаре вроде этого:

a_dict = {key: { anotherKey: value}} 

Или, если ДИКТ уже существует:

a_dict[key] = {anotherkey: value} 
print a_dict[key][anotherkey] 
Смежные вопросы