2015-03-19 85 views
5

我在Python中有作業問題。
我在Linux上使用Python 3.4.0版。
,我讀一個CSV文件中的設計文件規定使用內置的功能,指定爲NAMES.DAT,這是格式:
在Python中,將包含關鍵字對的列表添加到字典最簡單的方法是什麼?

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

我然後將這些關鍵字對添加到字典,這是我堅持的部分。
我迄今的代碼是這樣的:

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

我的想法是,如果我在格式列表元素「名稱:NAME2」,我打電話與元素作爲詞典更新功能參數,它會正確映射到字典中的一個關鍵字對。
然而,這種情況並非如此,因爲我當我運行該腳本得到這個錯誤:

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

ThisThis看起來相似,但我覺得這就夠了不同的問題,值得單獨響應。
我在這裏做錯了什麼,我該如何解決?
有沒有更簡單的方法來做到這一點?

回答

5

@Paulo Scardine有一個偉大的答案,如果你想創建一個從指定csv一個確切的數據集。如果你想基於密鑰一個可以使用它來組合值:

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) 

數據看起來就像是:

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

這可能是進一步簡化,但我認爲這給了很好的例子,有人學習可以遵循。

編輯:以下@Paulo Scardine評論

+1

這個成語添加setDefault方法是如此普遍在Python,有一些語法糖吧:看'dict.setdefault'和'collections.defaultdict'。 – 2015-03-19 03:58:02

+0

整潔,我一直在從我的AI類從R移動到Python,這些方法可能會爲我節省一些頭痛的問題 – JGreenwell 2015-03-19 04:05:54

3

試試這個:

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

如果你的文件是:

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將是:

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

也許你想要的,而不是listlistdictdict

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) 

所得:

{'name': [ 'name2', 'name3', 'name2', 'name3', 'name2', 'name3', 'name2', 'name3'], 
'name2': ['name4', 'name4', 'name4', 'name4'], 
'name3': ['name5', 'name5', 'name5', 'name5']} 
相關問題