2016-11-23 35 views
0

我想創建一個函數,它接受學生的測試答案和答案鍵,並返回一個列表,指出他們是否使用1和0得到答案對或錯。 這裏是我的代碼如何讓兩個字符串爲每個字符返回true或false?

answerkey='ABCABCDDD' 
student11='BBCCBCDDD' 
def check_answers(X='student',Y='answer key'): 
    result=[] 
    for i in range(len(X)): 
     for o in range(len(Y)): 
      if i==o: 
       result.append('1') 
      else: 
       result.append('0') 
     return result 
print(check_answers(student11,answerkey)) 

我的輸出應該給我:

['0','1','1','0','1','1','1','1','1'] 

相反,它給了我這樣的:

['1', '0', '0', '0', '0', '0', '0', '0', '0'] 

我到底做錯了什麼?

回答

3

這都可以通過使用理解和zip被簡化:

>>> ['1' if x == y else '0' for x, y in zip(answerkey, student11)] 
['0', '1', '1', '0', '1', '1', '1', '1', '1'] 

但是,解決你的問題,你實際上在做與內環不必要的額外步驟。這是一個額外的低效率,你不需要。依靠你的兩個列表相同的事實,重複一遍,然後與另一個列表進行比較。使用enumerate,這樣在每次迭代中,您都可以訪問索引的值

另外,您沒有正確使用默認關鍵字參數。您默認將它們分配爲一個字符串,並且沒有對這種分配的默認情況做任何事情,因此請將其刪除。

觀察:

answerkey='ABCABCDDD' 
student11='BBCCBCDDD' 
def check_answers(X, Y): 
    result=[] 
    for i, v in enumerate(answerkey): 
      if v == student11[i]: 
       result.append('1') 
      else: 
       result.append('0') 
    return result 
print(check_answers(student11,answerkey)) 

輸出:

['0', '1', '1', '0', '1', '1', '1', '1', '1'] 
+0

我會用'[STR(INT(A == B))去A,B以zip (answerkey,student11)]'個人,但馬匹的課程。 +1 –

+0

@ZeroPiraeus嗯,是的。這更乾淨。如果兩者之間有性能提升,我真的很好奇。我會檢查出來的。 – idjaw

+0

@ZeroPiraeus 2.2625668048858643(mine)vs 5.353425979614258 – idjaw

1

發生這種情況,因爲你oi指望通過一系列即它們都指望0,1,2...len(X),你也到Y的每個值迭代對於X的每個值,您應該比較相同索引列表中的變量

answerkey='ABCABCDDD' 
student11='BBCCBCDDD' 

def check_answers(X,Y): 
    result=[] 
    for i in range(len(X)): 
     if X[i] == Y[i]: 
      result.append('1') 
     else: 
      result.append('0') 

    return result 

print(check_answers(student11,answerkey)) 

在該算法中,它遍歷X的長度並將列表的每個值與相同的索引進行比較,例如,它檢查是否X[0] = Y[0]

此外,在你的函數中,你讓X ='學生'和Y ='答案''這很好,因爲你只有兩個參數,它覆蓋了它們,但如果你以後添加更多,這可能會導致一個問題,如果你的意圖是隻有這些作爲意見,我建議只是把它放在它下面#X = student and Y = answer key更清潔

0

如果你想弄清楚你做錯了什麼,我戰略性地把2打印聲明會告訴你什麼是你的代碼的問題。

def check_answers(X='student',Y='answer key'): 
    result=[] 
    print('X: %d, Y: %d' % (len(X), len(Y))) 
    for i in range(len(X)): 
     for o in range(len(Y)): 
      print('i: %d, o: %d' % (i, o)) 
      if i==o: 
       result.append('1') 
      else: 
       result.append('0') 
     return result 
0

就在另外其他的答案我建議你使用地圖功能

answerkey='ABCABCDDD' 
student11='BBCCBCDDD' 
def check_answers(X='student',Y='answer key'): 
    return map(lambda a,b:a==b and '1' or '0',X,Y) 
print(check_answers(answerkey,student11)) 
相關問題