如何比较字典的值(列表)与单独的列表?

问题描述:

比方说,我给一本字典:如何比较字典的值(列表)与单独的列表?

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

而且名单:

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

我只是想检查每个元素从针对在字典中的值的给定索引处的答案一致。总之,比较每个列表与答案。 然后我会打印一个学生正确的次数。

例如,如果我比较关键“阿德里安”的价值与我会得到4的答案。如果我比较杰米对答案我会得到2.如果我比较亚当的答案我会得到2.

我怎样才能比较两个?

非常感谢您的帮助!

+3

请编辑问题并添加您尝试过的代码。 –

您可以使用压缩()来获取值的组合和答案

for k,v in students.items(): 
    ans = 0 
    for i, j in zip(v,answers): 
     if i==j: 
      ans+=1 
    print ans 

>>> 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是他们的回答与答案,然后将它们进行比较,然后它总结了造成布尔。

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()将做逐列总和(铸真1和假0),将阵列减少到:

adam  2 
adrian 4 
jamie  2 
+0

即使这种方法是可行的,我也不会说在不存在问题标签时使用熊猫是非常好的。至少添加一个解释。 – Netwave

我想这样的作品

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) 

{'阿德里安:4, '亚当':2, '杰米':2}

+0

这取决于你对复杂的定义是什么。 –

这样的事情?

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()} 

给我们

{ '阿德里安':4, '杰米':2 '亚当':2}

基于集合A溶液()

示例

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和答案我得到元组。如果元组中包含两个相同的元素,则会使其具有唯一性。

当我减少元组列表时,我使用这样一个事实,即如果该集合中有多个元素,它就是一个错误答案的标志&。