从词典中计算Python中的平均函数

时间:2013-11-08 04:22:48

标签: python dictionary average

我需要能够计算字典中权重的平均值。这也需要是一个功能。这是我的代码

animal=dict()
animal['1']={'ID': '21012', 'plot':4, 'year':'1993', 'species': 'DM', 'weight': 42, 'hindfoot': 36, 'tag':'1EA0F9'}
animal['2']={'ID':'22012', 'plot':4, 'year':'1995', 'species': 'DM', 'weight': 31, 'hindfoot': 37, 'tag':'0D373C'}
animal['3']={'ID': '23012', 'plot':17, 'year':'1996', 'species': 'DM', 'weight': 25, 'hindfoot': 37, 'tag':'64C6CC'}
animal['4']={'ID': '24012','plot':21, 'year':'1996', 'species': 'PP', 'weight': 26, 'hindfoot': 22, 'tag':'1F511A'}
animal['5']={'ID': '25012', 'plot':22, 'year':'1997', 'species': 'DM', 'weight': 53, 'hindfoot': 35, 'tag':'2624'}
animal['6']={'ID': '26012', 'plot':17, 'year':'1997', 'species': 'OT', 'weight': 14, 'hindfoot': 18, 'tag':'2863'}
animal['7']={'ID': '27012', 'plot':18, 'year':'1997', 'species': 'OT', 'weight': 23, 'hindfoot': 21, 'tag':'2913'}
animal['8']={'ID': '28012', 'plot':13, 'year':'1998', 'species': 'OT', 'weight': 36, 'hindfoot': 19, 'tag':'2997'}
animal['9']={'ID': '29012', 'plot':6, 'year':'1999', 'species': 'PM', 'weight': 20, 'hindfoot': 20, 'tag':'406'}
animal['10']={'ID': '30000', 'plot':14, 'year':'2000', 'species': 'DM', 'weight': 41, 'hindfoot': 34, 'tag':'156'}

result=dict()

def calc_avg(r):
    if all(isinstance(x, numbers.Number) for x in r["weight"]):
        print a["title"],":", sum(r["weight"])/float(len(r["weight"]))
        return

import numbers    
calc_avg(animal.items)

2 个答案:

答案 0 :(得分:0)

您的问题是,您假设您可以通过调用r["weight"](无论r可能是什么)来生成动物砝码列表 - 这不能简单地使用python词典来完成。如果您想使用这种技术,您可能会研究更复杂的数据结构,如Pandas DataFrame

但我会假设您要继续按原样使用字典。首先,我建议您传递整个字典animals而不是调用生成密钥,值animal.items()(请注意,它的方式通过函数和不是字典值)。

其次,您可以通过简单地调用isinstance(someObject, (int, long, float))来测试对象是否为数字 - 这里的优点是针对numbers.Number的测试可能允许复数,这不是有效权重(可能) - 加上更清楚。

将这些放在一起(省略a["title"],因为它未包含在代码中):

def calc_avg(r):         if all(isinstance(x [“weight”],(int,long,float))对于r.values()中的x:             打印总和(x [r]中的x [“权重”] r.values())/ float(len(r))

calc_avg(animal)

为了改进这一点,当一个简单的列表就足够时,没有理由需要字典来存储这些值。此外,不是检查所有权重是否有效,而是只能对具有有效权重的权重进行平均。

animal = [
    {'ID': '21012', 'plot':4, 'year':'1993', 'species': 'DM', 'weight': 42, 'hindfoot': 36, 'tag':'1EA0F9'},
    {'ID':'22012', 'plot':4, 'year':'1995', 'species': 'DM', 'weight': 31, 'hindfoot': 37, 'tag':'0D373C'},
    {'ID': '23012', 'plot':17, 'year':'1996', 'species': 'DM', 'weight': 25, 'hindfoot': 37, 'tag':'64C6CC'},
    {'ID': '24012','plot':21, 'year':'1996', 'species': 'PP', 'weight': 26, 'hindfoot': 22, 'tag':'1F511A'},
    {'ID': '25012', 'plot':22, 'year':'1997', 'species': 'DM', 'weight': 53, 'hindfoot': 35, 'tag':'2624'},
    {'ID': '26012', 'plot':17, 'year':'1997', 'species': 'OT', 'weight': 14, 'hindfoot': 18, 'tag':'2863'},
    {'ID': '27012', 'plot':18, 'year':'1997', 'species': 'OT', 'weight': 23, 'hindfoot': 21, 'tag':'2913'},
    {'ID': '28012', 'plot':13, 'year':'1998', 'species': 'OT', 'weight': 36, 'hindfoot': 19, 'tag':'2997'},
    {'ID': '29012', 'plot':6, 'year':'1999', 'species': 'PM', 'weight': 20, 'hindfoot': 20, 'tag':'406'},
    {'ID': '30000', 'plot':14, 'year':'2000', 'species': 'DM', 'weight': 41, 'hindfoot': 34, 'tag':'156'}
]

def calc_avg(r):
    valid_weights = [x["weight"] for x in r if isinstance(x["weight"], (int, long, float))]
    print(sum(valid_weights) / float(len(valid_weights)))

calc_avg(animal)

答案 1 :(得分:0)

您没有正确地遍历列表。

您正在尝试遍历r['weight']。没有r['weight']。您传入animal.items(实际上应该是animal.items()),(如果您调用了该函数)是字典中(key, value)对的列表。我认为传递animal.values()实际上会更好,这只是值(因此你不会得到像('0', {...})这样的东西。)

如果您传入animal.values(),您将获得一个词典列表。这些词典中的每一个都有一个'weight'键,但列表本身没有,因此您无法遍历r['weight']。您需要做的是遍历r本身。您在迭代中获得的每个项目都有您正在寻找的密钥,因此它看起来像:

    if all(isinstance(x['weight'], numbers.Number) for x in r):
        avg = sum(x['weight'] for x in r) / float( len( r ) )

还有一些问题:

  • 为什么你不使用随机的result字典?
  • a['title']来自哪里?
  • 我会将import移到顶部,或者至少在您定义calc_avg的位置之上。