2015-09-09 84 views
1

我想寫一個函數,將採取保存在我的計算機中的文本文件,然後它將讀取文件中的所有名稱,並只獲得第一個每個姓名的字符,每個字符都換行。這些字符將成爲我創建字典的關鍵字,值將是文件中名稱以該字母開頭的次數。因此,如果文本文件如下:將文件轉換爲字符與字符重複計數值

Mary 
Jane 
Anna 
Judith 
Kim 
Melody 
Myriam 
Lauren 
Betty 
Holley 

然後我的字典裏應該是:

{'A':1, 'B':1, 'H':1, 'J':2, 'K':1, 'L':1, 'M':3} 

到目前爲止我的代碼看起來是這樣的:

def newDictionary(): 
names={} 
char = [] 
file = open(names) 
lines = file.readlines() 
for line in lines: 
    1char = file.read(line[1]) 
    1char.append(char) 
    for keys,values in names(): 

return names 

我知道它沒有結束,但是我不知道如何添加第一個字符重複的次數,然後使這些值與右鍵相對應。請幫幫我。 謝謝

回答

1

您可以使用collections.Counter

from collections import Counter 
with open('a.txt') as f: 
    counter = Counter([line[0] for line in f]) 
print(counter) 

這將打印:

Counter({'M': 3, 'J': 2, 'A': 1, 'B': 1, 'H': 1, 'K': 1, 'L': 1}) 
0

聰明的方式做,這是一個Counter,這是計數一種特殊類型的字典的東西。但你也可以用普通的字典做到這一點:

def newDictionary(filename): 
    names = {} 
    with open(filename) as f: 
     for line in f: 
      first = line[0] 
      if first in names: 
       names[first] += 1 
      else: 
       names[first] = 1 
    return names 

names = newDictionary('qdata') 
print(names) 

輸出

{'A': 1, 'B': 1, 'H': 1, 'K': 1, 'J': 2, 'M': 3, 'L': 1} 

有幾個與你的問題的代碼問題。

變量名稱必須以字母或下劃線開頭,它們不能以數字開頭,因此1char會給出語法錯誤。

您正在使用names作爲字典的名稱,但您也試圖將其作爲文件名稱給open(),這是行不通的。即使您在代碼中早些時候將names設置爲正確的文件名,一旦您執行了names={},它現在就會引用空字典。

您將文件的行加入lines = file.readlines()的列表中,然後再執行file.read(line[1])。您不需要再從文件中讀取:您已經獲得了所有內容。另外,file.readlines()文件指針位於文件尾部,因此不能從中讀取更多數據(除非您使用其.seek()方法「回捲」文件)。

此外,你想第一個字符line。你可以通過line[0]得到,因爲Python使用從零開始的索引; line[1]讓你獲得第二個字符。

0

有些改變會使得你的代碼可行:

def newDictionary(): 
    names={} 
    lines = open(in_file).readlines() 
    for item in lines: 
     names[item[0]]=names.get(item[0],0)+1 
    return names 

OUTPUT:

{'A': 1, 'B': 1, 'H': 1, 'K': 1, 'J': 2, 'M': 3, 'L': 1}