【问题标题】:How to compared two lists in python and return them in dictionary如何比较python中的两个列表并在字典中返回它们
【发布时间】:2026-01-07 07:15:02
【问题描述】:

我有两个列表: 姓名:['Mary', 'Jack', 'Rose', 'Mary', 'Carl', 'Fred', 'Meg', 'Phil', 'Carl', 'Jack', 'Fred', 'Mary', 'Phil', 'Jack', 'Mary', 'Fred', 'Meg']

成绩:[80, 88, 53, 80, 64, 61, 75, 80, 91, 82, 68, 76, 95, 58, 89, 51, 81, 78]

我希望能够取每个人考试成绩的平均值。例如,玛丽在姓名列表中出现了 4 次,我希望能够获取映射到她的测试分数并取该平均值。

问题是如何将重名与考试成绩进行比较。

注意:我知道成绩列表比姓名列表长,但这是给我的两个列表。

这是我到目前为止所做的事情

def average_grades(names, grades):
  averages = dict()

  name_counter = 0
  for name in names:
    # if the name is the same 

    if name == names:
    # count the occurence of the name
      name_counter += 1
      print(name_counter)
    # cycle through the grades
      # for grade in grades:
      #   print(grade)

【问题讨论】:

    标签: python arrays python-3.x dictionary


    【解决方案1】:

    这是一种方法:

    from collections import defaultdict, Counter
    
    names = ['Mary', 'Jack', 'Rose', 'Mary', 'Carl', 'Fred', 'Meg', 'Phil', 'Carl', 'Jack', 'Fred', 'Mary', 'Phil', 'Jack', 'Mary', 'Fred', 'Meg']
    
    grades = [80, 88, 53, 80, 64, 61, 75, 80, 91, 82, 68, 76, 95, 58, 89, 51, 81, 78]
    
    score = defaultdict(int)
    # this line initializes a default dict with default value = 0
    
    frequency = Counter(names)
    # this yields: Counter({'Mary': 4, 'Jack': 3, 'Fred': 3, 'Carl': 2, 'Meg': 2,'Phil': 2, 'Rose': 1})
    
    for name, grade in zip(names, grades):
        score[name] = score.get(name,0)+(grade / frequency[name])
        # here you add the (grade of name / count of name) to each name,
        # score.get(name,0) this line adds a default value 0 if the key does not exist already
    
    print(score)
    

    输出:

    defaultdict(<class 'int'>, {'Mary': 81.25, 'Jack': 76.0, 'Rose': 53.0, 'Carl': 77.5, 'Fred': 60.0, 'Meg': 78.0, 'Phil': 87.5})
    

    注意:它忽略了最后一个成绩,因为我不知道如何处理它。

    【讨论】:

      【解决方案2】:

      您可以并行迭代,找到它们的平均值并添加到字典中:

      from itertools import groupby
      from collections import defaultdict
      
      names = ['Mary', 'Jack', 'Rose', 'Mary', 'Carl', 'Fred', 'Meg', 'Phil', 'Carl', 'Jack', 'Fred', 'Mary', 'Phil', 'Jack', 'Mary', 'Fred', 'Meg']    
      grades = [80, 88, 53, 80, 64, 61, 75, 80, 91, 82, 68, 76, 95, 58, 89, 51, 81, 78]
      
      d = defaultdict(int)
      f = lambda x: x[0]
      for k, g in groupby(sorted(zip(names, grades), key=f), key=f):
          grp = list(g)
          d[k] = sum(x[1] for x in grp) / len(grp)
      
      print(d)
      

      【讨论】: