字典列表中值的子集的平均值

时间:2017-08-01 21:19:19

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

我有一个词典列表。我想要年龄小于25岁的人的平均年龄。

我知道我的除数是错的,但我不确定如何在理解中调整它。

我得到81/8 = 10.125。我应该得到81/5 = 16.2。如何使除数与要添加的元素数相匹配?

people = [{'name': 'John', 'age': 47, 'hobbies': ['Python', 'cooking', 'reading']},
          {'name': 'Mary', 'age': 16, 'hobbies': ['horses', 'cooking', 'art']},
          {'name': 'Bob', 'age': 14, 'hobbies': ['Python', 'piano', 'cooking']},
          {'name': 'Sally', 'age': 11, 'hobbies': ['biking', 'cooking']},
          {'name': 'Mark', 'age': 54, 'hobbies': ['hiking', 'camping', 'Python', 'chess']},
          {'name': 'Alisa', 'age': 52, 'hobbies': ['camping', 'reading']},
          {'name': 'Megan', 'age': 21, 'hobbies': ['lizards', 'reading']},
          {'name': 'Amanda', 'age': 19, 'hobbies': ['turtles']},
          ]


print(float(sum(d['age'] for d in people if d['age'] < 25)) / len(people))

3 个答案:

答案 0 :(得分:2)

最简单的解决方案是将numpy与条件列表理解结合使用:

import numpy as np

>>> np.mean([p['age'] for p in people if 'age' in p and p['age'] < 25])
16.199999999999999

使用纯python解决方案,您应该在评估集合中的每个元素时跟踪总计和计数。这样可以减少内存占用,因为您不需要存储符合条件的所有值。请注意,我在枚举中使用了生成器。

total_age = 0.
for n, age in enumerate((p['age'] for p in people if 'age' in p and p['age'] < 25), start=1):
    total_age += age
>>> print(total_age / n)
16.2

答案 1 :(得分:1)

我没有在一个列表理解中完成所有操作,而是将其分成两个命令,如下所示:

>>> under_25 = [x['age'] for x in people if x['age'] < 25]
>>> avg_age = sum(under_25)/float(len(under_25))

在一个列表推导中完成所有这些操作需要你做两次(一次用于分子中的和,另一次用于分母中的长度)。我认为这也更具可读性。

您甚至可以尝试在for循环中执行此操作:

count = 0
s = 0
for person in people:
    if person['age'] < 25:
        s += person['age']
        count += 1
avg_age = float(s)/count

答案 2 :(得分:1)

Python有一个statistics模块,其中包含mean函数:

>>> from statistics import mean
>>> mean(d['age'] for d in people if d['age'] < 25)
16.2

或者,如果您有pandas,则可以使用布尔索引来执行此操作:

>>> import pandas as pd

>>> df = pd.DataFrame(people, columns=['name', 'age', 'hobbies'])
>>> df[df['age'] < 25]['age'].mean()
16.2

df[df['age'] < 25]仅包含年龄低于25且行['age'].mean()的行计算&#34;年龄&#34;的平均值。列。