获得a
和b
的加权平均值的最简单/最短/ 最Pythonic方法是什么?
a = (
{
0: {'P': 0.3, 'Z': 0.3, 'N': 0.3},
'P': {'P': 0.9, 'Z': 0.1, 'N': 0.0},
'Z': {'P': 0.1, 'Z': 0.9, 'N': 0.1},
'N': {'P': 0.0, 'Z': 0.1, 'N': 0.9}
},
{
'P': {'A': 0.3, 'C': 0.3, 'T': 0.2, 'G': 0.2},
'Z': {'A': 0.3, 'C': 0.3, 'T': 0.2, 'G': 0.2},
'N': {'A': 0.3, 'C': 0.3, 'T': 0.2, 'G': 0.2}
}
)
b = (
{
0: {'P': 0.3, 'Z': 0.3, 'N': 0.3},
'P': {'P': 0.3, 'Z': 0.3, 'N': 0.3},
'Z': {'P': 0.3, 'Z': 0.3, 'N': 0.3},
'N': {'P': 0.3, 'Z': 0.3, 'N': 0.3}
},
{
'P': {'A': 0.25, 'C': 0.25, 'T': 0.25, 'G': 0.25},
'Z': {'A': 0.25, 'C': 0.25, 'T': 0.25, 'G': 0.25},
'N': {'A': 0.25, 'C': 0.25, 'T': 0.25, 'G': 0.25}
}
)
这样生成的c = [(a * a_weight) + (b * b_weight) / (a_weight + b_weight)]
应该具有相同的结构(a
和b
)。
如果有人知道Pythonic的答案,谢谢。
c
结构例如,如果a_weight
= b_weight
= 0.5(简单平均值),那么c
的第一个'P':
行
'P': {'P': (0.9 + 0.3) / 2, 'Z': (0.1 + 0.3) / 2, 'N': (0.0 + 0.3) / 2}
将是
的平均值 a
的{{1}}和
'P': {'P': 0.9, 'Z': 0.1, 'N': 0.0}
的{{1}}。
基本上,只有b
s的平均值(而每'P': {'P': 0.3, 'Z': 0.3, 'N': 0.3}
个保持原样)。
答案 0 :(得分:2)
我创建一个接受两个输入的函数,并根据它们的类型递归转换它们:
def combine(a, b, a_weight, b_weight):
if isinstance(a, tuple):
return tuple(combine(x,y,a_weight,b_weight) for x,y in zip(a,b))
elif isinstance(a, dict):
return dict((k, combine(a[k],b[k],a_weight,b_weight)) for k in a)
#add other data structures here if you need to (e.g. list, set, etc.)
else: #assume a number
return ((a * a_weight) + (b * b_weight)) / (a_weight + b_weight)
这种方法的好处是即使你改变了输入的结构它也会继续工作。
请注意,此代码假定a
和b
的结构相同,元组具有相同数量的元素,并且字典具有相同的键。如果情况并非总是如此,则需要添加代码来验证这一点。