查找与字典中值列表的最低均值对应的键

Finding key that corresponds to the lowest mean of a list of values in a dictionary

我正在尝试创建一个函数,对于字典中的每个条目,取每个条目的值列表的平均值,returns 是对应于最低平均值的键。 如果列表中的任何位置都存在负值,它应该首先删除它们,然后正常计算均值。

例如:

least_mean({'Option1': [0, 1, 2], 'Option2': [8, 9, -9999],'Option3': [0, -9999, 5, 3]})

应该return 'Option1' 因为它的均值最低 1.5

我的尝试

def least_mean(string):
    empty = []
    for i in string:
        empty.append((i,sum([j for j in string[i] if j > 0])/len([j for j in string[i] if j > 0])))
    return empty

我创建了一个函数,该函数 return 是一个包含每个选项及其平均值的元组列表。但是,我不确定如何让这个函数本身更具体到 return 'Option1'。例如,在 returns

中插入 ({'Option1': [0, 1, 2], 'Option2': [8, 9, -9999],'Option3': [0, -9999, 5, 3]})
[('Option1', 1.5), ('Option2', 8.5), ('Option3', 4.0)]

但我想 'Option1' 一个人。如果可能的话,这可以在没有导入的情况下在一行列表理解中完成吗?

您可以使用带有自定义 key 参数的 min() 来查找与最小均值对应的键,忽略负值。不需要列表理解:

from statistics import mean

data = {'Option1': [0, 1, 2], 'Option2': [8, 9, -9999],'Option3': [0, -9999, 5, 3]}

result = min(data, key=lambda x: mean(filter(lambda x: x >= 0, data[x])))

print(result)

如果您不想使用 statistics 导入,您可以使用:

result = min(data, key=lambda x: sum(filter(lambda x: x >= 0, data[x])) \
    / sum(1 for _ in filter(lambda x: x >= 0, data[x])))

这输出:

Option1

如果您想添加到现有的提取最小选项的方法中,请使用:

data = [('Option1', 1.5), ('Option2', 8.5), ('Option3', 4.0)]

result, _ = min(data, key=lambda x: x[1])
print(result)

这也输出:

Option1