2016-06-17 2 views
0

У меня есть словарь, который хранит список элементов для каждой клавиши, как показано ниже:Как печатать ключи и значения словаря в виде таблицы?

name_dict = {'MiddleName': ['H.', 'T.'], 'LastName': ['Perkins', 'Joseph'], 'FirstName': ['Elizabeth ', 'Scott ']} 

Я хочу напечатать данные в словаре как формат таблицы:

FirstName,MiddleName,LastName # the keys of the dictionary 
Elizabeth,H.,Perkins #the values of the keys in one line (the first item in the list) 
Scott,T.,Joseph #the values of the keys in new line (the following item in the list) 

Как решить эту проблему ?

Я попытался сделать предлагаемое решение Gareth Latty, но это не сработало.

with open('C:/Output.csv',"w+") as file: 
    w = csv.DictWriter(file,name_dict.keys()) 
    w.writeheader() 
    w.writerow(name_dict) 

Он выводит следующее:

MiddleName,LastName,FirstName 
"['H.', 'T.']","['Perkins', 'Joseph']","['Perkins', 'Joseph']" 

Любой идеи, как выводить значение (пункт в списке) каждый из ключей в новой строке?

+0

Извините! ваше право должно быть «Dict» не «результаты» – MEhsan

+0

Но это не решит проблему – MEhsan

+0

oh nevermind! Теперь я вижу структуру вашего словаря ... вам нужно будет использовать 'zip', но ... hmm –

ответ

1

csv.DictWriter ожидает словарь с field:single_line парами для каждой строки, которая, к сожалению, не то, что у вас есть, вы в принципе необходимо преобразовать структуру данных, чтобы быть список dicts для одиночных линий:

[{'MiddleName': 'H.', 'FirstName': 'Elizabeth ', 'LastName': 'Perkins'}, {'MiddleName': 'T.', 'FirstName': 'Scott ', 'LastName': 'Joseph'}] 

Вы можете преобразовать его с чем-то вроде этого:

import csv 

def seperate_entries(dict_of_lists):  
    iters = [(k,iter(v)) for k,v in dict_of_lists.items()] 
    try: 
     while True: 
      yield {k:next(v) for k,v in iters} 
    except StopIteration: 
     return 
name_dict = {'MiddleName': ['H.', 'T.'], 'LastName': ['Perkins', 'Joseph'], 'FirstName': ['Elizabeth ', 'Scott ']} 

with open('sample.csv',"w+") as file: 
    w = csv.DictWriter(file,name_dict.keys()) 
    w.writeheader() 
    w.writerows(seperate_entries(name_dict)) 
1

я думаю вы не принимаете dict. Если у вас несколько значений, вы должны использовать listdicts, а не dict, значение которых равно lists.Вместо

Dict = {'MiddleName': ['H.', 'T.'], 'LastName': ['Perkins', 'Joseph'], 'FirstName': ['Elizabeth ', 'Scott ']} 

Вы должны сделать:

Dict = [{'FirstName': 'Elizabeth', 'MiddleName': 'H.', 'LastName': 'Perkins'}, {'FirstName': 'Joseph', 'MiddleName': 'T. ', 'LastName': 'Scott'}] 

или в более читаемом версии:

Dict = [ 
    {'FirstName': 'Elizabeth', 'MiddleName': 'H.', 'LastName': 'Perkins'}, 
    {'FirstName': 'Joseph',  'MiddleName': 'T. ', 'LastName': 'Scott' } 
] 

Если вы хотите напечатать одну строку (один словарь в списке), вы может сделать что-то подобное:

def printDict(d): 
    print d["FirstName"] + "," + d["MiddleName"] + "," + d["LastName"] 

И если вы хотите напечатать каждый из элементов в списке у вас есть:

def printList(l): 
    for i in l: 
     printDict(i) 

И просто использовать его так:

printList(Dict) 

С первым (оригинал) Dict, доступ к Dict["FirstName"] вернется list, а при печати он будет печатать как:

[ "Элизабет", "Joesph"]

Но со вторым (новым способом я предложил) Dict, обращающийся Dict[0]["FirstName"] возвратит string, и будет печатать как:

Элизабет

+0

Я бы предположил, что словарь, о котором идет речь, не просто закодирован в фактический код, это не «музыка из« dict », а просто неправильный формат для использования с' csv.DictWriter' –

0

Для получения доступа к ключам в словаре, просто необходимо сделать следующее:

middleNames=Dict['Middlename'] 
firstNames=Dict['FirstName'] 
lastNames=Dict['LastName'] 

Теперь у вас есть доступ к значениям, хранящимся во внутренней информации списка, это может так же быть доступно следующим:

# Find how many items read (optional) 
len(middleNames) 

# Then iterate through the items 
for mName in middleName: 
    print mName # this will print each list item e.g. 

H.

Т.

# for brevity, this is the same as doing this... 
middleName[0] etc 

Надеется, что это помогает.

0

Я уверен, что есть более эффективные способы достижения того, чего вы хотите, но это закладывает простой план того, что вы хотите, и показывает, как вы можете его достичь.

names = {'MiddleName': ['H.', 'T.'], 'LastName': ['Perkins', 'Joseph'], 'FirstName': ['Elizabeth ', 'Scott ']} 

output = open('output.txt','w') 

#NOTE: this will write headers in alphabetical format. You will need to change that so it follows the FirstName, MiddleName, LastName pattern 
for key in sorted(names.keys()): 
    output.write(key + ',') 

output.write('\n') 

#assuming we always have same amount of middle, first, and last names 
for i in range(len(names['FirstName'])): 

    personFname = '' 
    personLname = '' 
    personMname = '' 

    for key in names.keys(): 
     if key == 'MiddleName': 
      personMname = names[key][i] 
     elif key == 'FirstName': 
      personFname = names[key][i] 
     elif key == 'LastName': 
      personLname = names[key][i] 

    output.write(personFname + ',' + personMname + ',' + personLname) 
    output.write('\n') 

output.close() 
0

Необходимо определить, сколько у вас строк. Просто поместите его в строки со всеми ключами в Диктоне.

import csv 

Dict = {'MiddleName': ['H.', 'T.'], 'LastName': ['Perkins', 'Joseph'], 'FirstName': ['Elizabeth ', 'Scott ']} 

len_row = 2 
with open('Output.csv', "w+") as file: 
    w = csv.DictWriter(file, Dict.keys()) 
    w.writeheader() 
    for i in range(len_row): 
     row = {} 
     for k in Dict.keys(): 
      for v in Dict.values(): 
       row[k] = Dict[k][i] 
     w.writerow(row) 
Смежные вопросы