在Python中对两个配对列表的重复值取平均

3 投票
5 回答
1929 浏览
提问于 2025-04-16 06:05

在我的代码中,我从不同的来源得到了两个不同的列表,但我知道它们的顺序是一样的。第一个列表(“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

撰写回答