2016-04-01 68 views
1

如果我有例如文件:在行拆分後添加字典鍵和值?

;;; 
;;; 
;;; 
A 1 2 3 
B 2 3 4 
C 3 4 5 

而且我想把它讀入的字典{STR:STR的名單}:

{'A': ['1', '2', '3'], 'B': ['2', '3', '4'], 'C': ['3', '4', '5'] 

我有以下代碼:

d = {} 
with open('file_name') as f: 
    for line in f: 
     while ';;;' not in line: 
      (key, val) = line.split(' ') 
     #missingcodehere  
return d 

我應該在line.split之後放入什麼,以便將鍵和值分配爲str和str列表?

回答

0

爲什麼不乾脆:

def make_dict(f_name): 
    with open(f_name) as f: 
     d = {k: v.split() 
      for k, v in [line.strip().split(' ') 
          for line in f 
          if ';;;' not in line]} 

    return d 

然後

>>> print(make_dict('file_name')) 
{'A': ['1', '2', '3'], 'B': ['2', '3', '4'], 'C': ['3', '4', '5']} 
+1

你可以像這樣使用:return dict([.... Without value'd'。 – JRazor

+0

這段代碼非常糟糕,它不夠靈活,爲什麼使用一個生成器,如果你不會在一行寫這段代碼? – JRazor

+1

@JRazor:FWIW,它是一種字典理解,不是生成器。 –

4

專注於你的代碼和你在做什麼錯。

你幾乎在與你的​​無限循環。所以,你想改變你的邏輯,試圖將數據插入到你的字典中。只需使用條件語句來檢查if ';;;'是否在您的行中。

然後,當您從line.strip().split(' ')獲得您的密鑰和值時,只需將其分配給您的字典即d[key] = val即可。然而,你需要一個列表,而val現在是一個字符串,所以在val上調用split。

此外,您不需要需要括號爲key and val。它向您的代碼提供不需要的噪聲

最終的結果將會給你:

d = {} 
with open('new_file.txt') as f: 
    for line in f: 
     if ';;;' not in line: 
      key, val = line.strip().split(' ') 
      d[key] = val.split() 

print(d) 

使用您的樣品輸入,輸出是:

{'C': ['3', '4', '5'], 'A': ['1', '2', '3'], 'B': ['2', '3', '4']} 

最後,提供一個改進的實施,因爲它可以製成更Python。我們可以簡化這個代碼,並提供了一個小的改進,以更一般地分裂,而不是明確的計算空間:

with open('new_file.txt') as fin: 
    valid = (line.split(None, 1) for line in fin if ';;;' not in line) 
    d = {k:v.split() for k, v in valid} 

所以,上面,你會發現我們的分裂看起來是這樣的:split(None, 1)。我們在哪裏提供maxsplit=1

split文檔字符串,它說明它非常好:

返回的S中的單詞的列表,使用月作爲 分隔符字符串。如果給出maxsplit,最多maxsplit 拆分完成。如果未指定sep或爲None,則任何 空白字符串都是分隔符,空字符串 已從結果中刪除。

最後,我們簡單地使用字典理解來獲得我們的最終結果。

+0

謝謝,這個工作。 – Vlad

+1

@Vlad非常歡迎。請不要忘記接受幫助解決你的問題的答案,因爲它向別人表明了什麼是有幫助的。 – idjaw