使用类的Python前20个名称代码

2024-05-19 12:25:36 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,所以我想找出一种方法,打印出某一年前20个宝宝的名字。我有超过200个文本文件,每一个名字,有多少次出现的名称。他们是按性别划分的这就是一个例子

year 1992:

Ashley,F,38451
Jessica,F,38349
Amanda,F,25027
Brittany,F,24974
Sarah,F,24632
Samantha,F,24402
Emily,F,21831
Stephanie,F,19670
Elizabeth,F,19020
Megan,F,17843
...

Michael,M,54373
Christopher,M,42459
Matthew,M,37729
Joshua,M,36207
Andrew,M,30530
Brandon,M,29618
Daniel,M,29138
Tyler,M,28792
James,M,28502

我需要找到一种方法,把任何一年的排名前20名的名字,不分性别,在提示年份时打印出来。如果不输入完整的txt文件名及其目录,我也不知道如何提示年份。我尝试了:

^{pr2}$

我不明白为什么这样不行。另外,我想我需要做一个这样的类和一个条目的方法:

class entry():
    __slots__ = ('gender', 'rank')

def mkEntry(...):
    ...

它应该有这样的输出

Enter Year: 1992
1. Josh (M): 52013
2. Jessica (F): 51001
3. Michael (M): 48923

...


20. Sarah (F): 34013

我只是不明白如何把文件分成最高级别,不分性别,然后打印出前20名。我猜你用的是单子,但我怎么能做到呢?我们将非常感谢所有的帮助。在

编辑:

好吧,我已经开发了代码,但是有一个错误,一个列表不能有列的属性,如果军衔>;飞行等级你能告诉我我做错了什么吗?在

https://gist.github.com/anonymous/fa367ff6955b10ae6e11


Tags: 方法名称名字year例子年份文本文件性别
2条回答

Martijn的回答说明了如何读入数据。但是,假设每个名字和性别在每个文件中只出现一次,就不需要计数器了。你可以用heapq.n最大. 这使它成为一行代码而不是三行代码,这意味着您一次只需要足够的内存来存储20个名称,而不是文件中的所有名称。

当我不在电话上的时候,我会用真实的测试代码来编辑这个,但是类似这样的东西:

# above here the same as Martijn's code up to reader
top20 = heapq.nlargest(reader, operator.itemgetter(2))
for name, sex, count in top20:
    # same print line as in Martijn's code

打开文件时需要连接字符串,或使用字符串格式;open()的工作方式与print()不同,它不会猜测应该连接哪些参数:

for line in open('names/yob{}.txt'.format(year)):

接下来,您有CSV文件,所以使用csv模块来读取它们:

^{pr2}$

接下来,我将使用^{}来跟踪名称计数:

from collections import Counter
counts = Counter()

for row in reader:
    name, sex, count = row
    counts[name, sex] += int(count)

现在你有了每个人的姓名和性别统计,并可以要求前20名:

for (name, sex), count in counts.most_common(20):
    print('{} ({}): {}'.format(name, sex, count))

相关问题 更多 >