2014-03-26 137 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) 
相關問題