好吧所以我试图想办法打印给定年份的前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:你能告诉我我做错了吗?
答案 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