如何在Python dict中求出同一个键的平均值

如何在Python dict中求出同一个键的平均值,python,dictionary,data-structures,Python,Dictionary,Data Structures,我有以下Python词典列表 [{"country": "IE", "values": ["Server1-17.6650", "Server3-78.6064", "Server2-3.7286"]}, {"country": "CA", "values": ["Server1-100.0000"]}, {"country": "DE", "values": ["Server2-100.0000"]}, {"country": "JP", "values": ["Server2-100.000

我有以下Python词典列表

[{"country": "IE", "values": ["Server1-17.6650", "Server3-78.6064", "Server2-3.7286"]}, {"country": "CA", "values": ["Server1-100.0000"]}, {"country": "DE", "values": ["Server2-100.0000"]}, {"country": "JP", "values": ["Server2-100.0000"]}, {"country": "IT", "values": ["Server1-100.0000"]}, {"country": "US", "values": ["Server1-6.3158", "Server3-15.7895", "Server2-77.8947", "Server1-5.5556", "Server3-2.7778", "Server2-91.6667", "Server1-12.6145", "Server3-86.8043", "Server2-0.5811"]}, {"country": "CZ", "values": ["Server1-100.0000"]}, {"country": None, "values": ["Server1-100.0000", "Server2-100.0000", "Server2-100.0000", "Server1-100.0000"]}, {"country": "A", "values": ["Server2-100.0000"]}, {"country": "IL", "values": ["Server1-100.0000"]}, {"country": "BR", "values": ["Server2-100.0000"]}, {"country": "KP", "values": ["Server1-100.0000"]}, {"country": "SG", "values": ["Server1-79.2000", "Server2-20.8000"]}, {"country": "ES", "values": ["Server1-100.0000"]}]
现在,对于每个
,如果服务器名称在列表中重复,我必须在服务器的
-
后面平均出它的值。基本上,对于上述列表,最终输出为

[{"country": "IE", "values": ["Server1-17.6650", "Server3-78.6064", "Server2-3.7286"]}, {"country": "CA", "values": ["Server1-100.0000"]}, {"country": "DE", "values": ["Server2-100.0000"]}, {"country": "JP", "values": ["Server2-100.0000"]}, {"country": "IT", "values": ["Server1-100.0000"]}, {"country": "US", "values": ["Server1-8.1619", "Server3-35.1238", "Server2-56.7141"]}, {"country": "CZ", "values": ["Server1-100.0000"]}, {"country": None, "values": ["Server1-100.0000", "Server2-100.0000", "Server2-100.0000", "Server1-100.0000"]}, {"country": "AU", "values": ["Server2-100.0000"]}, {"country": "IL", "values": ["Server1-100.0000"]}, {"country": "BR", "values": ["Server2-100.0000"]}, {"country": "KP", "values": ["Server1-100.0000"]}, {"country": "SG", "values": ["Server1-79.2000", "Server2-20.8000"]}, {"country": "ES", "values": ["Server1-100.0000"]}] 
我在Python中尝试了以下代码

for key_dict in resp:
    for i, value in enumerate(key_dict['values']):
        for j, new_value in enumerate(key_dict['values']):
            if value[:value.index('-')] == new_value[:new_value.index('-')]:
                key_dict['values'][i] = value[:value.index('-')] + str(float(value[value.index('-'):]) + float(new_value[new_value.index('-'):]))
                del key_dict['values'][j]

但这并不能产生我所需要的结果。有人能指出如何在python中做到这一点吗。

这是一个在正确的数据结构中无关紧要的问题,而在没有数据结构的情况下则很痛苦。如果
values
是一个将服务器名称映射到数字列表的字典,而不是一个大的字符串列表,那么这将很容易:

如果您可以控制值首先到达的方式,那么您应该这样做。如果不能,则可能需要手动转换它们。像这样:

for key_dict in resp:
    new_values = {}
    for value in key_dict['values']:
        name, number = value.split('-', 1)
        new_values.setdefault(name, []).append(float(number))
    key_dict['values'] = new_values
现在,平均它们是微不足道的:

for key_dict in resp:
    averages = {}
    for name, numbers in key_dict['values'].items():
        averages[name] = sum(numbers) / len(numbers)
    key_dict['values'] = averages
如果确实需要在结尾将其转换回字符串,可以:

for key_dict in resp:
    key_dict['values'] = ['{}-{}'.format(name, value) 
                          for name, value in key_dict['values'].items()]
当然,如果您真的想:

for key_dict in resp:
    values = {}
    for value in key_dict['values']:
        name, number = value.split('-', 1)
        values.setdefault(name, []).append(float(number))
    values = ['{}-{}'.format(name, sum(numbers)/len(numbers))
              for name, numbers in values.items()]
    key_dict['values'] = values

您可以在此处使用
groupby

import numpy as np
from itertools import groupby

def average_servers(server_list):

    post_split = [x.split('-') for x in server_list]
    averages = []

    for server, data in groupby(sorted(post_split), lambda x: x[0]):

         cur_average = np.mean([float(x[1]) for x in list(data)])
         averages.append('{}-{}'.format(server, cur_average))

    return averages
然后应用函数生成一个新的字符串列表,作为
键的值:

for entry in your_data_structure:
    entry['values'] = average_servers(entry['values'])

你能控制数据结构吗?让“值”成为一个包含服务器名称及其结果值的字典会更有意义。你是对所有3个答案都投了否决票,还是其他人只是无缘无故地来投票?因为我可能理解有人合法地否决了mescalinum的答案(没有任何解释,实际上这只是我答案中最后一个版本的一种模糊方式),但我无法想象为什么有人会否决Ohrounuruus的答案。不,我没有否决这些答案中的任何一个。几分钟前有人否决了所有3个答案,没有任何解释。不知道为什么。如果我想除以列表的最大长度,那么我的值实际上等于100,而不是
len(numbers)
,你能帮助我吗。上述解决方案会导致拆分,总计超过100。@user567797:要获取dict中列表的最大长度
d
max(d.values(),key=len)
将返回长度最长的列表,然后
len(that)
将给出该列表的长度。这就是你想要的吗?@user567797:好的,如果你想对所有列表的长度求和,你可以使用
sum
函数而不是
max
函数:
sum(len(v)表示d中的v.values())