如何在python中比较两个列表并在dictionary中返回它们

2024-05-16 01:28:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子: 姓名:['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]

我希望能够取每个人的平均考试成绩。例如,Mary在名字列表中出现了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)

Tags: thenameinfornamescounterfred名字
2条回答

这里有一个方法:

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

注意:它忽略了最后一个年级,因为我不知道该怎么处理它。你知道吗

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

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)

相关问题 更多 >