将一行上的输入分配给它的行号?

Assigning a input on a line to its line number?

我在 AIO(澳大利亚信息学奥林匹克竞赛)培训问题网站上解决了以下问题(问题以斜体字显示,细节以粗体显示,我的尝试如下):

问题

百科全书

输入文件:encyin.txt

输出文件:encyout.txt

时间限制:1秒

My Very First Encyclopedia Appreciation Society 又是问答之夜。一周又一周,你参加了这些小测验,熟练地回答了关于动物园里的动物和星期几的问题,最后却被其他人回答了所有晦涩难懂的奖金回合问题,抢了第一名而离开了你除了一张 'Nice Try!' 贴纸。

沮丧和沮丧,当你想到一个想法时,你正坐在家里沉思你过去的失败。难道是……?翻阅几个月愤怒潦草的笔记,你证实了你偷偷摸摸的怀疑——奖金问题遵循一个超级简单的模式!你的心跳了一下。您参加过的每场测验的每轮奖励中的每一个问题都以以下形式表述:“我的第一本百科全书的第 x 页上有多少个单词?”通常你会认为这不太可能,甚至是人为的,但今天不是 - 今天你有一个火星酒吧可以获胜。

您非常小心地编制了一份页码列表及其相应的字数。其他人可能会尝试记住这个列表,但不,你的计划要高科技得多:首先,你将编写一个可以为你回答这些问题的程序;然后,您可以将您可信赖的笔记本电脑偷偷带入测验,并继续闪电战。

剩下的就是您实际编写程序了。任务看起来很简单:它必须获取你的数字列表和今晚的奖金问题,然后 - 悄悄地 - 为你打印出正确答案。

输入

输入的第一行将采用 n q 形式,其中 n 是百科全书的页数,q 是要回答的问题数。 (1 <= n, q <= 10,000)

接下来是 n 行,每行描述一页。这些行中的第 i 个将包含单个整数 pi,即第 i 页上的单词数。 (0 <= 圆周率 <= 2,000,000,000)

接下来是 q 行,每行描述一个问题。这些行中的每一行都将包含一个整数 x,表示问题“第 x 页上有多少个单词?” (1 <= x <= n)

输出

对于每个问题,您的程序都应该写一行输出。此行应包含一个整数,即所请求页面上的字数。

我的尝试

我能够很容易地写出代码的开头:

file = open("encyin.txt", "r")
pages, questions = file.readline().split()
pages = int(pages)
questions = int(questions)
for i in range (0, int(pages)):
    words = int(file.readline())

但我不确定下一步该做什么。如何将给定的每个数字分配给一行?例如,第i行有一个整数描述第i页的字数,那么我如何将这个值分配给第i页?

谢谢 - 我正在写 python。

你能试试这个吗?

with open("encyin.txt") as f:
    parts = next(f).split()
    pages = int(parts[0])
    questions = int(parts[1])
    counts = []
    # capture counts
    for _ in range(pages):
        num_pages = int(next(f))
        counts.append(num_pages)
    # answer questions
    for _ in range(questions):
        book = int(next(f))
        print(counts[book - 1])

我注意到的第一件事是您正在遍历 i in range(0, int(pages)),但是,页面仅从第 1 行开始(第 0 行由 n 和 q 组成)。

所以你的for循环应该更像(你也想做+1因为你想计算最后一页,否则python只会去'uptil but not including'):

for i in range (1, pages + 1):
    words = int(file.readline().strip())

在这里,我们放置了 .strip() 函数,这样我们在将其转换为 int 时就不会出错。默认情况下,文本文件在每一行的末尾都有 \n(输入字符),而 python 不理解 int("5\n") 的含义。 strip() 函数有助于去除输入字符和任何尾随 'whitespaces'.

现在,您可能希望将每行的单词数存储在某处,为此您可以使用字典 (https://www.w3schools.com/python/python_dictionaries.asp) 或列表。

列表索引从 0 开始,但每页字数行从 1 开始,即使您可以不用列表,但字典会更直观。

words_per_page = {}

您可以查看我提供的 link 以了解它们的工作原理。然后我们可以将单词添加到字典中:

for i in range (1, int(pages) + 1):
    number_of_words = int(file.readline().strip())
    words_per_page[i] = number_of_words

然后,您可以用问题遍历每一行。在这里,我们在每页字数结束的行之后的行开始 for 循环:

all_questions = []
for question_index in range(pages + 2, 1 + pages + questions):
    all_questions.append(file.readline().strip())

由此,您将获得 1 部以页码为关键字、每页单词为值的词典以及包含所有问题的列表。然后你可以遍历这些并获得页面中的单词数:

for page_number in all_questions:
    no_of_words = words_per_page[int(page_number)]
    # You can then store this variable somewhere or write to a text file

现在,我还没有测试任何这段代码,但一切背后的想法都是一样的。如果您确实遇到任何错误,请务必发表评论。