2016-06-17 9 views
0

Ich habe ein Wörterbuch, das eine Liste von Elementen für jeden Schlüssel speichert, wie gezeigt:Wie werden die Schlüssel und Werte eines Wörterbuchs als Tabelle ausgegeben?

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) 

Wie dieses Problem lösen:

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

ich die Daten in dem Wörterbuch als Tabellenformat drucken möchten ?

Ich habe versucht, die vorgeschlagene Lösung von Gareth Latty, aber das hat nicht funktioniert.

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

Es gibt die folgende:

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

eine Idee, wie die Werte ausgeben (das Element in der Liste) von jedem der Taste in neuen Zeilen?

+0

Entschuldigen Sie! Ihr Recht sollte es sein "Dict" nicht "Ergebnisse" – MEhsan

+0

Aber das wird das Problem nicht lösen – MEhsan

+0

oh vergiss! Ich sehe nun die Struktur Ihres Wörterbuchs ... Sie müssen 'zip' verwenden, aber ... hmm –

Antwort

1

csv.DictWriter erwartet ein Wörterbuch mit den field:single_line Paare für jede Zeile, die leider nicht das, was Sie ist haben, müssen Sie im Grunde Ihre Datenstruktur konvertieren eine Liste von dicts für die einzelnen Linien zu sein:

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

Sie können es konvertieren mit etwas wie folgt aus:

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

Ich glaube, Sie missbrauchen dict. Wenn Sie mehrere Werte haben, sollten Sie einen list von dicts und nicht einen dict verwenden, dessen Werte lists sind.Statt

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

sollten Sie tun:

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

oder in eine besser lesbare Version:

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

Wenn Sie eine Zeile (ein Wörterbuch der Liste) drucken möchten, können Sie kann so etwas tun:

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

Und wenn Sie jedes der Elemente in der Liste drucken möchten Sie haben:

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

Und es einfach so verwenden:

printList(Dict) 

Mit Ihrer ersten (original) Dict, Dict["FirstName"] Zugriff zurückkehren würde ein list, und wenn sie gedruckt werden als drucken würde:

[ "Elizabeth", "Joesph"]

Aber mit der zweiten (neuen Art und Weise vorgeschlagen I) Dict, Dict[0]["FirstName"] Zugriff auf ein string zurückkehren würde, und wie drucken:

Elizabeth

+0

Ich nehme an, das Wörterbuch in Frage ist nicht nur hart in den eigentlichen Code codiert, das ist kein "mususe of' dict ", sondern nur nicht das richtige Format für die Verwendung mit' csv.DictWriter' –

0

Um die Schlüssel im Wörterbuch zugreifen zu können, müssen nur Folgendes tun:

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

Sie haben jetzt Zugriff auf die Werte in der inneren Liste Informationen gespeichert,

# 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.

T.

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

this helps: Dies kann in ähnlicher Weise durch die folgenden zugegriffen werden.

0

Ich bin mir sicher, es gibt effizientere Wege, um das zu erreichen, was Sie wollen, aber dies legt eine einfache Beschreibung dessen fest, was Sie wollen und zeigt, wie Sie es erreichen können.

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

Sie müssen definieren, wie viele Zeilen Sie haben. Nur flach in Reihen mit allen Schlüsseln in Dict.

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)