def main():
score = 0
answers = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
testA = open('newfile.txt', 'r')
for line in testA:
gr = str(line)
if gr == str(answers[line]):
score+=1
testA.close()
checkpass(score)
def checkpass(score):
if score >= 15:
print("You passed")
else:
print("You failed")
main()
我试图编写一些^代码,它接受一个文本文件并将其条目与上面记录的列表进行比较。如果文本文件中的字母与同时索引处的列表中的字母相同,则累加器应添加一个。为什么我不能检查列表中A == A或B == B?有人可以解释我做错了吗?
答案 0 :(得分:3)
当您使用for line in testA:
迭代文件时,line
变量会从文件中获取包含一行的字符串。
但是,您尝试将此字符串用作answers
列表(answers[line]
)的索引。如果每行应该按顺序与答案匹配,则需要逐个索引到answers
列表中。这意味着您要将行数字 用作索引:answers[line_number]
。
幸运的是,使用enumerate()
:
for line_number,line_contents in enumerate(testA):
gr = str(line_contents )
if gr == str(answers[line_number]):
当迭代某些内容时,enumerate
将为迭代中的每个项目提供索引和项。
请注意,line_contents
已经是一个字符串,因此str()
强制转换中没有任何意义。此外,由于您要将每个字符与单个字符进行比较,因此您可能希望从输入文件中删除任何空格。我们可以通过调用str.strip()
:
for line_number,line_contents in enumerate(testA):
gr = line_contents.strip()
if gr == str(answers[line_number]):
使用文件时,最好在with
块中使用它们。这可以确保文件自动关闭,即使在执行过程中出现问题:
with open('newfile.txt', 'r') as testA:
for line_number,line_contents in enumerate(testA):
gr = line_contents.strip()
if gr == str(answers[line_number]):
score += 1
答案 1 :(得分:1)
让我们看一下有问题的部分
for line in testA:
gr = str(line)
if gr == str(answers[line]):
score+=1
line
是str
类型,与您可能习惯的Javascript不同,for
在python中构造返回值,而不是键的。所以你可以使用enumerate
来提供一个方便的索引,你可以像其他答案一样引用答案。但是,有一个更好的构造,zip
,这将允许你这样做:
for answer, line in zip(answers, testA):
if answer == line.strip(): # strip off the trailing newline
score += 1
答案 2 :(得分:1)
合并zip
和sum
可以简化此功能
def main():
answers = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
with open('newfile.txt', 'r') as testA:
score = sum(i.strip() == j for i, j in zip(testA, answer))
checkpass(score)
答案 3 :(得分:0)
我对你正在使用的语言不是100%肯定,但对于大多数编程语言,列表从0开始编制索引。这意味着你必须根据你想要的值检查数组的第0个条目。 / p>
在大多数语言中,例如c ++,语法相当容易使用(您可能必须转换为您正在使用的语言。
用于检查值的C ++语法: //如果你愿意,忽略'char'部分,那不是Python的一部分(我相信)。 char someArray [] = {'a','b','c'...}; //创建列表,添加随机数量的元素
if (someArray[0] == 'a) // This checks to make sure the 0th entry is 'a' before continuing
{
... Do something ...
}
基本上索引告诉你要在数组中评估的位置,所以它需要一个整数来执行此操作。如果你想传递一个字符串,它就不会有你所说的任何线索。
编辑:我在标签上看到它是用Python编写的,但我传达的一般含义应该仍然适用。答案 4 :(得分:0)
假设答案的长度和testA中的行相等,则为索引器添加一个计数器,如下所示:
def main():
score = 0
answers = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
testA = open('newfile.txt', 'r')
counter = 0 #initialize counter
for line in testA:
gr = str(line)
if gr == answers[counter]:
score+=1
counter += 1 #increment counter
testA.close()
checkpass(score)
def checkpass(score):
if score >= 15:
print("You passed")
else:
print("You failed")
main()