【问题标题】:How to compare a dictionary's values(lists) against a separate list?如何将字典的值(列表)与单独的列表进行比较?
【发布时间】:2017-09-05 03:13:35
【问题描述】:

假设给了我一本字典:

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。

如何比较两者?

非常感谢您的帮助!

【问题讨论】:

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

标签: python list loops dictionary iteration


【解决方案1】:
>>> 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}

这为每个学生zips 他们的答案与答案进行比较,然后将结果布尔值相加。

【讨论】:

    【解决方案2】:
    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 非常好。至少添加一个解释。
    【解决方案3】:

    这样的?

    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}

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        一个基于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() 将使其唯一。

        当我减少元组列表时,我使用的事实是,如果集合中有多个元素,则表示答案错误并计算它。

        【讨论】:

          【解决方案6】:

          我认为这可行

          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}

          【讨论】:

          • 这取决于您对复杂的定义。
          猜你喜欢
          • 1970-01-01
          • 2020-11-07
          • 1970-01-01
          • 2019-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-30
          相关资源
          最近更新 更多