Python前20名使用类命名代码

时间:2013-10-11 21:25:07

标签: python class

好吧所以我试图想办法打印给定年份的前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文件名的情况下提示今年是我试过的:

def main():
    year = input('Enter Year: ')
    for line in open('names/yob',str(year),'.txt'):
        print(line)

我不明白为什么这不起作用。我还认为我需要创建一个类似这样的课程和一种输入方式:

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名。我猜你使用列表但我怎么能这样做呢?非常感谢所有帮助。

编辑:

好吧我已经开发了代码,但是如果mlst.rank>我得到的错误是列表不能具有排名属性。 flst.rank:你能告诉我我做错了吗?

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

2 个答案:

答案 0 :(得分:3)

打开文件时需要连接字符串,或者使用字符串格式化; open()不像print()那样有效,它不会猜测应该连接哪些参数:

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

接下来,您有CSV文件,因此请使用csv模块阅读它们:

import csv

with open('names/yob{}.txt'.format(year), 'rU') as infile:
    reader = csv.reader(infile, delimiter=',')

接下来,我会使用collections.Counter()来跟踪姓名数量:

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))

答案 1 :(得分:1)

Martijn的回答显示了如何读取数据。但是,假设每个文件只出现一次名称和性别,则不需要计数器。你可以使用heapq.nlargest。这使得它成为单行而不是三行,这意味着您只需要足够的内存来存储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