我有一个词典列表。我想要年龄小于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))
答案 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;的平均值。列。