簡體   English   中英

如何檢查答案是否在2D列表中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM