-1

I need to be able calculate the average of the weights in a dictionary. This also needs to be a function. Here is the code I have

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

2 回答 2

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)) for x in r.values()): print sum(x["weight"] for x in r.值())/浮动(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)
于 2013-11-08T04:53:15.067 回答
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
于 2013-11-08T04:54:49.853 回答