[英]How do I check if an answer is in a 2D list
blueprint = [[1,"A"], [2,"C"], [3,"B"], [4,"D"], [5,"A"], [6,"A"], [7,"B"], [8,"A"], [9,"C"], [10,"A"], [11,"D"], [12,"A"], [13,"C"], [14,"C"]
,[15,"B"], [16,"A"], [17,"B"], [18,"A"], [19,"C"], [20,"D"]]
def check_answer(students_answer):
points = 0
total = 20
if students_answer[0]==blueprint[0][1]:
points =+ 1
elif students_answer[1]==blueprint[1][1]:
points =+ 1
#etc.
else:
points =+ 0
score = (points*100)/(total)
return score
print(check_answer(["A", "C"]))
為什么我的函數無法計算出正確答案的百分比長於答案1(即“ A”)的時間?
我不知道為什么你需要召回列表中的索引blueprint
但如果數據是這樣的,你可以只zip
的數據一起,解壓縮,並進行比較。
這種方式確實沒有效率。 如果您有100個問題怎么辦? 您是否會復制/粘貼100次錯誤的elif
語句?
生成器理解為成功,得分為1,失敗為0,除以總數並乘以100,得出的sum
:
def check_answer(students_answer):
return 100*(sum(correct==attempt for (_,correct),attempt in zip(blueprint,students_answer))/len(blueprint))
blueprint
列表中元組的第一項是多余的,因為它們只是它們各自元組的索引加一個。 您應該改為使用簡單的字符串列表:
blueprint = ['A', 'C', 'B', 'D', 'A', 'A', 'B', 'A', 'C', 'A', 'D', 'A', 'C', 'C', 'B', 'A', 'B', 'A', 'C', 'D']
這樣您就可以使用兩個列表的郵政編碼來計算student_answer
中正確答案的百分比:
sum(1 for s, b in zip(student_answer, blueprint) if s == b) / len(student_answer) * 100
為什么我的函數無法計算出正確答案的百分比長於答案1(即“ A”)的時間?
讓我們來看看您的數據和功能
# data
blueprint = [[1,"A"], [2,"C"], [3,"B"], [4,"D"], [5,"A"], [6,"A"], [7,"B"], [8,"A"], [9,"C"], [10,"A"], [11,"D"], [12,"A"], [13,"C"], [14,"C"], [15,"B"], [16,"A"], [17,"B"], [18,"A"], [19,"C"], [20,"D"]]
# function call
print(check_answer(["A", "C"]))
blueprint
第一個列表是[1,"A"]
。 check_answer()
參數為["A", "C"]
。 當循環中的行運行時,它找到了要查找的內容
if students_answer[0]==blueprint[0][1]: # students_answer[0] is "A", blueprint[0][1] is "A", too
points =+ 1
elif students_answer[1]==blueprint[1][1]:
points =+ 1
#etc.
這意味着它將跳過所有省略號,否則將直接計算出score
。 這就是為什么score只包含第一個"A"
。
您可以使用的一種方法是使用zip(*blueprint)
將zip(*blueprint)
的列表解壓縮,
[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20),
('A', 'C', 'B', 'D', 'A', 'A', 'B', 'A', 'C', 'A', 'D', 'A', 'C', 'C', 'B', 'A', 'B', 'A', 'C', 'D')]
然后循環計算分數。
所以,
scorelist = list(zip(*blueprint))
total = len(scorelist[1])
answer_list = ["A", "C"]
first_a, second_a = answer_list
points = 0
for sc in scorelist[1]:
if sc == first_a or sc == second_a:
points += 1
score = (points*100)/(total)
print(score)
或者您甚至可以加入所有樂譜字符串並使用str.count()
joined_scores = ''.join(scorelist[1])
print(joined_scores)
# 'ACBDAABACADACCBABACD'
points = joined_scores.count(first_a) + joined_scores.count(second_a)
print(points*100/total)
# 65.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.