2015-03-19 15 views
5

Ich habe ein Hausaufgabenproblem in Python.
Ich verwende Python Version 3.4.0 unter Linux.
Das Design-Dokument heißt es, dass ich eine CSV-Datei erstellt unter Verwendung von Funktionen, angegeben als names.dat zu lesen, das ist im Format:
Was ist in Python der einfachste Weg, eine Liste bestehend aus Schlüsselwortpaaren zu einem Wörterbuch hinzuzufügen?

name:name2, name:name3, name2:name4, name3:name5\n (etc) 

Ich bin dann diese Keyword-Paare zu einem Wörterbuch hinzufügen , das ist der Teil, auf dem ich feststecke.
Der Code, den ich bis jetzt haben, ist dies:

dictionary = dict() 
database = open('names.dat', 'r') 
data = database.read() 
data = data.rstrip('\n') 
data = data.split(',') 
for item in range(len(data)): 
    dictionary.update(data[item-1]) 

Mein Denken, dass zu sein, wenn ich ein Listenelement im Format haben „name: name2“ und ich das Wörterbuch-Update-Funktion mit diesem Element als ein Aufruf Argument wird es korrekt zu einem Schlüsselwortpaar im Wörterbuch zugeordnet.
Dies ist jedoch nicht der Fall, wie ich diese Fehlermeldung erhalten, wenn ich dieses Skript ausführen:

File "MyName.py", line 7, in <module> 
    dictionary.update(data[item-1]) 
ValueError: dictionary update sequence element #0 has length 1; 2 is required 

This und This ähnlich erscheinen, aber ich fühle, dass dies genug von einer anderen Frage eines separaten zu rechtfertigen Antwort.
Was mache ich hier falsch, und wie kann ich es beheben?
Gibt es einen einfacheren Weg, dies zu tun?

Antwort

5

@Paulo Scardine hat eine große Antwort, wenn Sie eine genaue Datenmenge aus der angegebenen CSV erstellen möchten. Wenn Sie möchten, um die Werte zu kombinieren, basierend auf dem Schlüssel könnte man diese verwenden:

changes = {} 
with open('test.csv', 'r') as f: 
    for row in f: 
     for e in row.rstrip('\n').split(", ") : #split lines by column 
      print (e) #just to show what is being generated here 
      (k,v) = e.split(":") #split further into key, value pairs 
      changes.setdefault(k, []).append(v) 
      #creates empty list if new key, adds value to list 

print (changes) 

Die Daten werden wie folgt aussehen:

{'name3': ['name5'], 'name2': ['name4', 'name6', 'name5'], 'name1': ['name', 'name4'], 'name': ['name2', 'name3']} 

Dieses weiter vereinfacht werden könnte, aber ich denke, das ist das gute Beispiel gibt, dass jemand Lernen kann folgen.

Edit: hat setdefault Methode folgende @Paulo Scardine Kommentar

+1

Dieses Idiom ist so verbreitet, in Python, dass es einige Syntax Zucker ist für sie: siehe 'dict.setdefault' und' collections.defaultdict'. –

+0

Ordentlich, ich habe von R nach Python für meine AI-Klasse gewechselt und diese Methoden könnten mir einige Kopfschmerzen auf der Straße ersparen – JGreenwell

3

Versuchen Sie folgendes:

data = [] 
with open('names.dat') as database: 
    for line in database: 
     if line.strip(): # skip blank lines 
      data.append(
       dict(i.split(":") for i in line.rstrip('\n').split(",")) 
      ) 

Wenn Ihre Datei ist:

name:name2,name:name3,name2:name4,name3:name5 
name:name2,name:name3,name2:name4,name3:name5 
name:name2,name:name3,name2:name4,name3:name5 
name:name2,name:name3,name2:name4,name3:name5 

data sein wird:

[{'name': 'name3', 'name2': 'name4', 'name3': 'name5'}, 
{'name': 'name3', 'name2': 'name4', 'name3': 'name5'}, 
{'name': 'name3', 'name2': 'name4', 'name3': 'name5'}, 
{'name': 'name3', 'name2': 'name4', 'name3': 'name5'}] 

Vielleicht möchten Sie eine dict von list anstelle eines list von dict:

data = {} 
with open('names.dat') as database: 
    for line in database: 
     if line.strip(): # skip blank lines 
      for k, v in (i.split(":") for i in line.rstrip('\n').split(",")): 
       data.setdefault(k, []).append(v) 

Resultierende:

{'name': [ 'name2', 'name3', 'name2', 'name3', 'name2', 'name3', 'name2', 'name3'], 
'name2': ['name4', 'name4', 'name4', 'name4'], 
'name3': ['name5', 'name5', 'name5', 'name5']} 
Verwandte Themen