2012-04-02 4 views
3

Anfänger Frage: Ich habe ein Wörterbuch, wo die Werte sind Listen von (eine Variable # von) Strings. Letztendlich möchte ich jeden Wörterbucheintrag in eine einzelne durch Tabulatoren getrennte Zeile schreiben, wobei der Schlüssel als Spalte 1 und die einzelnen Elemente aus der Werteliste als Spalten 2-n stehen. Ich habe den folgenden Code verwendet, um eine Ausgabedatei mit dem Schlüssel als Spalte 1 und der Werteliste als Spalte 2 zu generieren, aber ich bin mir nicht sicher, wie ich von dort fortfahren soll.Schreiben Schlüssel: Wert-Paare zu einer Tab-getrennte Datei mit Variablen # Werte

mydict = {'spider':['kate', 'susan'], 
      'fish':['kate'], 
      'dog':['andy'], 
      'cat':['andy','colby','jeff']} 
f = open('outfile.txt', 'w') 
writer = csv.writer(f, delimiter = '\t') 
for key, value in orfdict.iteritems(): 
    writer.writerow([orf] + [value]) 

Die Python-Dokumentation schlägt vor, dass Sie zip verwenden können() eine Liste Form Schlüssel zu erstellen: Wert-Paare, aber wenn ich versuche, diese auf der interaktiven Eingabeaufforderung:

>>> for key,value in mydict.iteritems(): 
...  mypair = zip(key,value) 
...  print mypair 

ich diesen seltsamen Ausgang offensichtlich zu verstehen, so dass ich ich bin nicht Dinge:

[('f', 'kate')] 
[('c', 'andy'), ('a', 'colby'), ('t', 'jeff')] 
[('s', 'kate'), ('p', 'susan')] 
[('d', 'andy')] 

ist der einfachste Weg, dies geht zu tun eine leere Liste für jede Iteration über das Wörterbuch erstellen, dann auf diese Liste f Anhänge Zuerst der Schlüssel und dann jeder der Werte mit einer eingerückten for-Schleife? Ich fühle mich, als müsste ich etwas verpassen.

+0

Dies ist, wofür JSON, XML und andere strukturierte Dokumentformate entwickelt wurden. Warum benötigen Sie eine tabulatorgetrennte CSV? – jozzas

+0

Die "seltsame Ausgabe" von zip wird dadurch erklärt, dass das Aufnehmen einer Zeichenfolge in einem Kontext, der eine Sequenz erwartet, die einzelnen Zeichen der Zeichenfolge ergibt; Das heißt, eine Zeichenfolge verhält sich wie eine Liste von Zeichen. Wenn man also 'Katze' mit ['andy', 'colby', 'jeff'] zippt, bricht die Katze in ['c', 'a', 't']. –

+0

@jozzas - weil ich noch nichts über diese Dateitypen weiß ... aber ich habe sie zu meiner Liste "zum Lernen" hinzugefügt. Vielen Dank! – pandaSeq

Antwort

5

dieses Versuchen einen einzelnen Wert zu einer bestehenden Liste hinzuzufügen:

writer.writerow([key] + value) 

(key ist ein einzelner Wert, value ist bereits eine Liste)

+0

Bekam es, danke! Ich habe die Funktion der eckigen Klammern nicht wirklich verstanden, aber das macht Sinn. – pandaSeq

+0

Die eckigen Klammern erzeugen im Grunde eine Liste. So erstellt '[1,2,3]' eine Liste mit den Elementen '1',' 2' und '3'. Genau so erstellt '[key]' eine Liste mit einem einzigen Element: 'key'. Und dann concat die erstellte Liste mit dem bereits vorhandenen. – poke

0

Versuchen Sie for-Schleife auf die folgende Veränderung:

for key, value in orfdict.iteritems(): 
    writer.writerow([key] + value) 

Da die Werte in orfdict Listen sind, in jeder Iteration value wird eine Liste sein. Zum Beispiel könnte in der ersten Iteration key'spider' sein, und value wäre ['kate', 'susan'], also [key] + value würde ['spider'] + ['kate', 'susan'] oder ['spider', 'kate', 'susan'] werden. lesen

0
>>> [(x, y) for x, x2 in mydict.iteritems() for y in x2] 
[('fish', 'kate'), ('cat', 'andy'), ('cat', 'colby'), ('cat', 'jeff'), ('spider', 'kate'), ('spider', 'susan'), ('dog', 'andy')] 
2

Es sieht aus wie Sie einige Ihrer Variablen umbenannt, und andere nicht umbenennen, ich nehme an, dass Sie für Ihre Beispielcode gemeint:

mydict = {'spider':['kate', 'susan'], 
      'fish':['kate'], 
      'dog':['andy'], 
      'cat':['andy','colby','jeff']} 
f = open('outfile.txt', 'w') 
writer = csv.writer(f, delimiter = '\t') 
for key, value in mydict.iteritems(): 
    writer.writerow([key] + [value]) 

csv Schriftsteller in dieser unnötig erscheint Fall, warum nicht verwenden:

mydict = {'spider':['kate', 'susan'], 
      'fish':['kate'], 
      'dog':['andy'], 
      'cat':['andy','colby','jeff']} 
f = open('outfile.txt', 'w') 
for key, value in mydict.iteritems(): 
    f.write('%s\t%s\n' % (key,'\t'.join(value))) 
f.close() 
+0

Hallo Keith, Dies ist in der Richtung der Dinge, die ich ohne Erfolg versucht habe.In diesem Fall gibt mir dieser Code den Fehler: Traceback (letzter Aufruf zuletzt): Datei "/Users/zuma/scripts/stackoverflow.py", Zeile 9, in f.write ('% s \ t% s \ n ')% (Schlüssel,' \ t'.join (value)) TypeError: nicht unterstützte Operandentypen für%: 'NoneType' und 'tuple' – pandaSeq

+0

Ich hatte zwei Fehler, die ich identifiziert hätte den Code getestet, entschuldige mich - der Code ist jetzt behoben. –

+0

In Übereinstimmung mit der akzeptierten Antwort und Ihrer Verwendung der CSV-Bibliothek wird es sich mit den Dingen richtig befassen, wenn die Werte in Ihrem dict-Objekt den gleichen Wert wie das Delimeter enthalten. Mit anderen Worten, wenn 'kate' 'kate \ tand \ tjim' wäre, würde mein Code zu drei Spalten führen, wenn er nur eins enthalten sollte, während die csv-Antwort in einer einzigen Spalte für 'kate \ tand \ tjunk' resultieren würde. , aber würde es in Anführungszeichen setzen. Ich weise darauf hin, weil es die Antwort, die csv verwendet, korrekter macht, und es fügt auch etwas hinzu, das Sie brauchen, um sicherzustellen, dass Sie beim Lesen der resultierenden CSV-Datei suchen. –