如何将字典的值(列表)与另一个列表进行比较?

3
假设我有一本字典:
students = {"adrian":["a","b","c","d"], "jamie":["b","b","a","d"], "adam":["a","c","d","d"]}

并且这是一个列表:

answers=["a","b","c","d"]

我只想检查每个元素是否与给定索引处的答案匹配,并与字典中的值进行比较。简而言之,将每个列表与答案进行比较。然后我将打印出每个学生正确答题的次数。
例如,如果我将键“adrian”的值与答案进行比较,我将得到4。如果我将jamie与答案进行比较,我会得到2。如果我将adam与答案进行比较,我会得到2。
如何进行比较?
非常感谢您的帮助!

3
请编辑问题并添加您尝试过的代码。 - shad0w_wa1k3r
6个回答

3
>>> students = {"adrian":["a","b","c","d"], "jamie":["b","b","a","d"], "adam":["a","c","d","d"]}
>>> answers = ["a","b","c","d"]
>>> {s:sum(t == a for t, a in zip(students[s], answers)) for s in students}
{'jamie': 2, 'adam': 2, 'adrian': 4}

对于每个学生,将他们的答案与标准答案进行zip压缩,然后进行比较,最终将结果布尔值相加。


1
import pandas as pd
students = {"adrian":["a","b","c","d"], "jamie":["b","b","a","d"], "adam":["a","c","d","d"]}
answers=["a","b","c","d"]
df = pd.DataFrame(students)
df.apply(lambda x: x==answers).sum()

一些解释:

df.apply(lambda x: x==answers) 

将为每个学生比较答案,生成以下数组:
    adam adrian  jamie
0   True   True  False
1  False   True   True
2  False   True  False
3   True   True   True

.sum()函数将对每一列进行求和(将True转换为1,False转换为0),从而将数组降维为:

adam      2
adrian    4
jamie     2

即使这种方法是可行的,我也不会说在不涉及问题标签时使用pandas是非常好的选择。至少要添加一些解释。 - Netwave

1
像这样的吗?
def get_correct_answers_count(given_answers,
                              correct_answers):
    return sum(1
               for student_answer, correct_answer in zip(given_answers,
                                                         correct_answers)
               if student_answer == correct_answer)


students_correct_answers_count = {
    student_name: get_correct_answers_count(given_answers=student_answers,
                                            correct_answers=answers)
    for student_name, student_answers in students.items()}

给我们

{'adrian': 4, 'jamie': 2, 'adam': 2}


0
你可以使用zip()来获取值和答案的组合。
for k,v in students.items():
    ans = 0
    for i, j in zip(v,answers):
        if i==j:
            ans+=1
    print ans

0

我认为这个可以工作

students = {"adrian":["a","b","c","d"],
          "jamie":["b","b","a","d"],
          "adam":["a","c","d","d"]}
answers = ["a","b","c","d"]

results = {}

for k,v in students.items():
    results [k] = 0
    for i,answer in enumerate(v):
        if answers[i] == v[i]:
            results[k]+=1

print (results)

{'adrian': 4, 'adam': 2, 'jamie': 2}

这段代码与编程有关。

这取决于你对“复杂”的定义是什么。 - David Bern

0
基于 set() 的解决方案
示例
data = {'jamie': ['a', 'b', 'c', 'd']}
answers = ['b', 'd', 'c', 'd']
tuples = map(set, zip(data['jamie'], answers))
reduce(lambda y, coll: (len(coll) - 1) + y , tuples, 0)

Out[8]: 2

这个例子利用了数据类型集合只能包含唯一值的特点。因此,通过将两个列表jamie和answers压缩成元组,如果元组中包含两个相同的值,则set()会使其变为唯一值。

当我减少元组列表时,利用了集合中有多个元素的事实,这表明答案错误并计数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接