2014-03-26 58 views
0
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?有人能解释我做错了什么吗?列表索引必须是int,而不是str。但我希望他们是str

+0

'如果GR == STR(答案[行]):'?你可能想要:'如果在答案中输入:' – alfasin

+0

我想你是说如果文件的第一行是'B',那么你想得分。如果第二行是'D',那么得分。一般来说,如果文件的第n行是“answers”中的第n个条目,那么就得分。从该规范中,您可以开始编写代码。 –

+0

我想检查gr是否等于索引#line处列表'answers'中的字符串字符。 – user3366963

回答

0

我对你使用的语言不是100%确定,但是对于大多数编程语言列表索引从0开始。这意味着你必须根据你想要的值检查数组的第0个条目。

在大多数语言,如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中,但我传达的一般意义仍然应该主要。

+0

难道我不能使用[line + 1]而不是[line],因为文本文件的第一行将作为第一行处理? – user3366963

+0

我相信在这种情况下'行'是指存储在行中的值,而不是行号本身。你可以使用另一个变量,它会是一个整数,并且每次都执行一个int ++操作。 – WeylynCadwell

3

当你重复的进行for line in testA:一个文件时,line变量从文件含有一行。

但是,您试图将此字符串用作您的answers列表(answers[line])中的索引。如果每行都按顺序与答案匹配,则需要逐个索引到answers列表中。这意味着您要使用number作为索引:answers[line_number]

幸运的是,这是简单的用Python做,与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

让我们来看看有问题的部分

for line in testA: 
     gr = str(line) 
     if gr == str(answers[line]): 
      score+=1 

linestr类型,不同的Javascript,你可能习惯了,for python构造返回值,而不是。所以你可以使用enumerate这将提供一个方便的索引,你可以像其他答案一样引用答案。然而,有一个更好的构建这是zip,这将让你这样做:

for answer, line in zip(answers, testA): 
     if answer == line.strip(): # strip off the trailing newline 
      score += 1 
+0

+1使用'zip'。 –

0

假设答案的长度和种皮的线都是平等的,你添加计数器,像这样一个索引:

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() 
+0

请勿使用'*'突出显示代码段!改为添加一个'#comment',或者留下一些有效的语法! –

+0

正如其他海报所说,它需要'gr = str(line).strip()'..所以如果@ user3366963不想使用'enumerate'或'zip',那么你也可以使用这个'counter'。 。 –

1

结合zipsum简化了这一功能很多

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) 
相关问题