1

好的,所以我正在尝试找出一种方法来打印给定年份的前 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

4

2 回答 2

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=',')

接下来我将使用 acollections.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))
于 2013-10-11T21:27:51.420 回答
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
于 2013-10-11T22:27:37.633 回答