2013-09-27 69 views
1

我對Python很新。我有一個從我的文本文件中存儲的名稱(第一個和最後一個)作爲字符串列表到Python中的列表。我試圖弄清楚如何得到列表中所有名字的姓氏中第二個字母的頻率。如何獲取列表中特定字符的頻率?

這裏有什麼是我的名字列表中的一個例子:

['Name', 'Allen Doe', 'Jane Doe', 'Larry Hackman'] 

從這個列表的頻率應該是1,和O的頻率應該爲2

這裏是我有到目前爲止:

n = open('name.txt', 'r') 
    with open('name.txt', 'r') as n: 
nameList = [line.strip() for line in n] 
print nameList 

from collections import Counter 
    nameFreq = Counter(nameList) 

print "The frequency of the second letter in last name is" 
print nameFreq 

我該如何操作計數器來只計數姓中的第二個字母?任何幫助表示讚賞。

回答

0

使用str.rsplit的名字從剛剛結束一次分裂,如果返回列表的長度> 1,則使用它的最後一個項目:

str.rsplit例如:

>>> 'foo bar spam'.rsplit(None, 1) 
['foo bar', 'spam'] 

演示:

>>> from collections import Counter 
>>> lis = ['Name', 'Allen Doe', 'Jane Doe', 'Larry Hackman'] 
>>> Counter(y[-1][1] for y in (x.rsplit(None, 1) for x in lis) if len(y)>1) 
Counter({'o': 2, 'a': 1}) 
+0

好,謝謝你這麼多!另外,如果我想要得到姓氏的第一個字母,我會在nameFreq中使用'Counter(y [0] [1]作爲y(x.rsplit(None,1)for nameFreq)if len(y)> 1)'。 – mikez1

+0

@ mikez1使用'y [-1] [0]'。 –

+0

好吧我將計數設置爲變量c。如果我想打印計數器的輸出,可以使用for循環,例如'for x in c:print x,c [x]'而不是'Counter({'o':2,'a':1} )' – mikez1

0

做兩個拆分它可能不是最優的,但這是我第一件事應該。

>>> Counter([x.split()[1][1] for x in nameList if len(x.split()) > 1]) 
0

你可以使用str.partition方法和字符串切片:

from collections import Counter 

with open('name.txt') as file: 
    names = [line.strip() for line in file] 

# 'foo bar spam' -> 'bar spam' 
lastnames = (name.partition(' ')[2] for name in names) 
i = 1 # 2nd character 
freq = Counter(name[i:i+1] for name in lastnames) 
print("\n".join("%s: %d" % (char, n) for char, n in freq.most_common() if char)) 
相關問題