[英]Python - List Comprehension problem: do i need nested List Comprehension?
我是 Python 新手,我不能做这个简单的练习(我现在很简单,但我无法解决它)。 我使用多种组合已经 4 年了,在 SO 和其他论坛中寻求帮助,但对我的问题没有任何帮助,这是我的噩梦:
letters_count = {
'Alpha': [10, 12, 0, 1],
'Beta': [15, 7, 9, 2],
'Gamma': [6],
'Delta': [2, 2, 4],
'Eta': [9, 9, 9],
}
我需要创建一个脚本,从该国家/地区的每个成功估计中减去给定国家/地区的平均值,仅使用列表理解(带括号)并且其输出与此类似:
[['Alpha', [4.25, 6.25, -5.75, -4.75]],
['Beta', [6.75, -1.25, 0.75, -6.25]],
['Gamma', [0]],
['Delta', [-0.66, -0.66, 1.33]],
['Eta', [0, 0, 0]]]
我想放一些我的代码,但没有一个有效
尝试这个:
[[k,[v[i] - sum(v)/len(v) for i in range(len(v))]] for k, v in letters_count.items()]
或者
[[key, [e-sum(value)/len(value) for e in value]] for key, value in letters_count.items()]
ps 谢谢,约翰
如果您使用的是python3.8,则可以避免多次求平均值。 您可以使用变量 ave(或平均值)并获取列表中每个元素与平均值的距离。 不要忘记将答案四舍五入到小数点后两位。 请注意,运算符是 := 而不是 =
letters_count = {
'Alpha': [10, 12, 0, 1],
'Beta': [15, 7, 9, 2],
'Gamma': [6],
'Delta': [2, 2, 4],
'Eta': [9, 9, 9],
}
result = [[letter, [round((ave - v), 2) for v in lst]] for letter, lst in letters_count.items() if (ave := sum(lst)/len(lst))]
print(result)
结果:
[['Alpha', [-4.25, -6.25, 5.75, 4.75]],
['Beta', [-6.75, 1.25, -0.75, 6.25]],
['Gamma', [0.0]],
['Delta', [0.67, 0.67, -1.33]],
['Eta', [0.0, 0.0, 0.0]]]
因此,与其一开始试图一次性完成所有事情,不如分解问题。
首先,您需要在每个列表中找到平均调整后的值。 看起来像:
adj_avg = lambda vals: [v - sum(vals) / len(vals) for v in vals]
从那里,很容易添加密钥以使其成为您想要的输出:
[[key, adj_avg(vals)] for key, vals in letters_count.items()]
变成:
[[key, [v - sum(vals) / len(vals) for v in vals]] for key, vals in letters_count.items()]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.