我需要能够计算字典中权重的平均值。这也需要是一个功能。这是我的代码
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)
答案 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
的位置之上。