2015-03-19 14 views
5

Python'da ödev problemim var.
Linux'ta Python sürüm 3.4.0 kullanıyorum. Bir CSV dosyasını okumak için duyuyorum
tasarım belge devletler Names.dat olarak belirtilen, fonksiyonlar inşa kullanarak, bu biçimindedir:
Python'da, bir sözlükte anahtar kelime çiftlerinden oluşan bir listeyi eklemenin en kolay yolu nedir?

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

Bir sözlüğe Bu anahtar kelime çiftleri eklemek için daha sonra duyuyorum , benim takılı olduğum kısım.
Ben bugüne kadar sahip kod şudur:

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]) 

Ben formatında bir liste elemanı varsa o varlık Benim düşünce "ismi: NAME2", ve bir şekilde bu eleman ile Sözlük güncelleme fonksiyonu çağırmak argüman, sözlükteki bir anahtar kelime çiftini düzgün şekilde eşler.
Ancak, ben bu komut dosyası çalıştırdığınızda bu hatayı olsun bu durum, değil:

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 ve This benzer görünüyor, ama bu ayrı bir garanti için farklı soru yeterli olduğunu hissediyorum tepki.
Burada neyi yanlış yapıyorum ve nasıl düzeltebilirim?
Bunu yapmanın daha basit bir yolu var mı?

cevap

5

@Paulo Scardine büyük cevabı vardır size verilen csv yapılan bire bir veri kümesi oluşturmak istiyorsanız. Eğer kullanabilirsiniz anahtar birinde bu dayalı değerleri birleştirmek isterseniz:

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) 

Veri gibi görünecektir:

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

Bu da basitleştirilmiş olabilir ama bu iyi bir örnek olduğunu verir düşünüyorum birisi öğrenme takip edebilir.

Düzenleme: @Paulo Scardine comment

+1

Bu deyim aşağıdaki ilave setDefault yöntemi bunun için bazı sözdizimi şeker olduğunu Python çok yaygın: 'dict.setdefault' ve' collections.defaultdict' bakın. –

+0

Neat, AI sınıfım için R'den Python'a geçiyorum ve bu yöntemler bana yol boyunca bazı baş ağrıları verebilir – JGreenwell

3

bu deneyin:

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(",")) 
      ) 

dosya ise:

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 olacaktır: Belki

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

Bir dict yerine list ait list ait istiyorum 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) 

Ortaya:

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