在Python中对两个配对列表的重复值取平均
在我的代码中,我从不同的来源得到了两个不同的列表,但我知道它们的顺序是一样的。第一个列表(“names”)包含了一些字符串作为键,而第二个列表(“result_values”)是一系列浮点数。我需要把这些键值对变得唯一,但我不能用字典,因为那样的话只会保留最后插入的值。相反,我需要对那些有重复键的值进行平均(算术平均)。
想要的结果示例:
names = ["pears", "apples", "pears", "bananas", "pears"]
result_values = [2, 1, 4, 8, 6] # ints here but it's the same conceptually
combined_result = average_duplicates(names, result_values)
print combined_result
{"pears": 4, "apples": 1, "bananas": 8}
我目前想到的办法涉及多次迭代,效果也不太好……有没有更优雅的解决方案呢?
5 个回答
3
你可以使用一种叫做累积移动平均的方法来计算平均值,这样只需要遍历列表一次就可以了:
from collections import defaultdict
averages = defaultdict(float)
count = defaultdict(int)
for name,result in zip(names,result_values):
count[name] += 1
averages[name] += (result - averages[name]) / count[name]
5
from collections import defaultdict
def averages(names, values):
# Group the items by name.
value_lists = defaultdict(list)
for name, value in zip(names, values):
value_lists[name].append(value)
# Take the average of each list.
result = {}
for name, values in value_lists.iteritems():
result[name] = sum(values) / float(len(values))
return result
names = ["pears", "apples", "pears", "bananas", "pears"]
result_values = [2, 1, 4, 8, 6]
print averages(names, result_values)
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
3
我还是会使用字典。
averages = {}
counts = {}
for name, value in zip(names, result_values):
if name in averages:
averages[name] += value
counts[name] += 1
else:
averages[name] = value
counts[name] = 1
for name in averages:
averages[name] = averages[name]/float(counts[name])
如果你担心列表太大,那我建议用来自itertools的izip
来替代zip
。