【问题标题】:Calculate median of dictionary values inside list计算列表中字典值的中位数
【发布时间】:2020-07-19 01:41:42
【问题描述】:

我正在计算列表中“分数”(字典值)的中位数

my_dict = {"John": [{"class": "math", "score": 100, "year": 2014}, {"class": "english", "score": 85, "year": 2015}, {"class": "science", "score": 90, "year": 2015}], 
"Timmy": [{"class": "math", "score": 87, "year": 2014}, {"class": "english", "score": 91, "year": 2015}], 
"Sally":[{"class": "math", "score": 95, "year": 2014}]}

输出如下所示:

new_dict = {"John": 90, "Timmy": 89, "Sally": 95}

我想我需要根据分数对 my_dict 进行排序,然后计算中值。如果不使用外部包装,则无法完全弄清楚这两个步骤。

任何帮助将不胜感激! Python 新手。

【问题讨论】:

  • 您不必对“my_dict”进行排序,但对于“my_dict”中的每个值(列表),您必须在新列表中提取“分数”(通过迭代列表项),对其进行排序并检索“my_dict”中一个键的中位数。先尝试自己做,然后在问题中将代码显示为格式正确的文本。

标签: python list dictionary list-comprehension dictionary-comprehension


【解决方案1】:

您可以使用来自statistics 的中位数。

from statistics import median

my_dict = {"John": [{"class": "math", "score": 100, "year": 2014}, {"class": "english", "score": 85, "year": 2015}, {"class": "science", "score": 90, "year": 2015}], 
"Timmy": [{"class": "math", "score": 87, "year": 2014}, {"class": "english", "score": 91, "year": 2015}], 
"Sally":[{"class": "math", "score": 95, "year": 2014}]}

new_dict = {}

for k, v in my_dict.items():
  m = []
  for l in v:
    m.append(l["score"])
  new_dict[k] = median(m)

print(new_dict)

如果你不想使用包并编写自己的函数,你可以这样调用:

def median(lst):
    n = len(lst)
    s = sorted(lst)
    return (sum(s[n//2-1:n//2+1])/2.0, s[n//2])[n % 2] if n else None

【讨论】:

  • statistics 不是“外部包”
【解决方案2】:

使用median 和dict理解的一个班轮

from statistics import median 
{k:median([v.get('score',0) for v in my_dict[k]]) for k in my_dict.keys()}

输出:

{'John': 90, 'Timmy': 89.0, 'Sally': 95}

【讨论】:

    【解决方案3】:
    my_dict = {"John": [{"class": "math", "score": 100, "year": 2014}, {"class": "english", "score": 85, "year": 2015}, {"class": "science", "score": 90, "year": 2015}], 
    "Timmy": [{"class": "math", "score": 87, "year": 2014}, {"class": "english", "score": 91, "year": 2015}], 
    "Sally":[{"class": "math", "score": 95, "year": 2014}]}
    
    import numpy as np
    medians = {}
    for k in my_dict.keys():
        ls = []
        for d in my_dict[k]:
            ls.append(d['score'])
        medians[k] = np.median(ls)
    
    print(medians)
    
    

    输出:

    {'Sally': 95.0, 'Timmy': 89.0, 'John': 90.0}
    

    您可以只使用 numpy.median 来计算中位数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2021-02-23
      • 2016-09-23
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多