2012-11-30 54 views
0

我正在嘗試編寫一個Python代碼,它可以讓我讀取文本,並按行讀取它的行 。在每行中,單詞作爲關鍵詞進入詞典,數字應該是分配的值,作爲列表。 例如,該文件將被由數百個行具有相同的格式,因爲這的:正在讀取文件,將文本行中的單詞和數字添加到字典中?

彼得17 29 24 284 72

在理想情況下,命名爲「彼得」將是一個關鍵在字典中,值將是dict[Peter]: [17, 19, 24, 284,7273]

我到目前爲止的問題是添加數字。我不知道如何將它們分配給關鍵值。

def wordDict(filename): 
     inFile=open(filename, 'r') 
     line=inFile.readline() 
     while line: 
      txtWords = line.split() # splits at white space 
      wordScores={} # make dict 
      scoreList=[] 
      for word in txtWords: 
       word.lower() # turns word into lowercase 
       if word in string.ascii_lowercase: #if word is alphabetical 
        if word not in wordScores.keys(): 
         wordScores=wordScores[word] # add the key to dictionary 

----------我只有

+0

看來,你還沒有發佈完整的代碼,否則你有一個語法錯誤。 else子句必須有內容或被刪除。 – Matt

+0

對不起,這是一個錯誤的代碼遺留的錯字。 – HP19

回答

0

如果您的線條都與一個字,然後空格分隔的整數開始,你可以做(​​未經測試):

myDict = {} 
with open('inFile.txt','r') as inFile: 
    for line in inFile: 
     line = line.split() 
     name = line[0].lower() 
     if name not in myDict: 
      myDict[name] = map(int,line[1:]) 
+0

我從來沒有嘗試過map()之前,這可能是一個選項。 – HP19

+0

'map()'很簡單,它接受一個函數和一個列表,並返回列表中每個項目調用函數的結果列表。在這種情況下,它將您從文件讀取的字符串轉換爲整數。它相當於列表理解'[int(x)for line [1:]]' – Matt

0

我還是要強調你的代碼兩個主要問題:

  1. for word in string.ascii_lowercase:是一樣的書寫for 'hello' in ['a','b,'c']:,它不會做你所期望的;而循環將永遠不會運行。

  2. wordScores = wordScores[word]這不是爲鑰匙添加任何東西,你的意思可能是wordScores[word] = []

試試這個:

from collections import defauldict 
words = defaultdict(list) 

with open('somefile.txt') as f: 
    for line in f: 
     if line.strip(): 
     bits = line.split() 
     if bits[0].isalpha(): 
      words[bits[0].lower()] += bits[1:] 
1

使用Python 3.2:

with open("d://test.txt", "r") as fi: # Data read from a text file is a string 
    d = {} 
    for i in fi.readlines(): 
     # So you split the line into a list 
     temp = i.split() 
     # So, temp = ['Peter', '17', '29', '24', '284', '72'] 

     # You could split 'temp' like so: 
     # temp[0] would resolve to 'Peter' 
     # temp[1] would resolve to ['17', '29', '24', '284', '72'] 
     name, num = temp[0], temp[1:] 

     # From there, you could make temp[0] the key and temp[1:] the value. 
     # But: notice that the numbers are still represented as strings. 
     # So, we use the built-in function map() to turn them into integers. 
     d[name] = [map(int, num)] 
+0

'[map(int,num)]'將列出一個int列表,這幾乎肯定不是是期望的。 (一個int列表的列表看起來像'[[7,8,9]]') – Matt

+0

我不確定是否需要行爲,但OP的代碼只會將列表添加到字典中,如果鍵是不是在字典中。 – Matt

相關問題