1

我对 Python 很陌生。我有一个名称列表(第一个和最后一个)作为字符串从我的文本文件存储到 python 中的一个列表中。我试图弄清楚如何获取列表中所有姓名的姓氏中第二个字母的频率。

这是我的姓名列表中的示例:

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

从这个列表中,a 的频率应该是 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

如何操纵计数器只计算姓氏中的第二个字母?任何帮助表示赞赏。

4

3 回答 3

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})
于 2013-09-27T04:02:10.457 回答
0

进行两次拆分可能不是最佳选择,但这是我想到的第一件事。

>>> Counter([x.split()[1][1] for x in nameList if len(x.split()) > 1])
于 2013-09-27T04:03:24.253 回答
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))
于 2013-09-27T05:40:47.513 回答