我想乘一个元组。
y = 0.1, 0.2, 0.2, 0.4, 0.1
x = {('S', 'A', 'C', 'T'): (0.2, 0.1, 0.9, 3, 4), ('S', 'C', 'T'): (0.4. 0.1, 0.3, 3,1)}
预期输出:
res = {('S', 'A', 'C', 'T'): (0.02, 0.02, 0.18, 1.2, 0.4), ('S', 'C', 'T'): (0.04. 0.02, 0.06, 1.2, 0.1)}
我的代码是:
from fuctools import partial:
res = {}
keys = list(set.keys())
vals = list(set.values())
mul = lambda x, y: x*y
for n in vals:
res.extend(map(partial(mul, x), y))
res = dict(res)
print(res)
但是这会导致该字典没有属性'extend'
的错误。
答案 0 :(得分:2)
这应该可以解决问题:
y = 0.1, 0.2, 0.2, 0.4, 0.1
x = {('S', 'A', 'C', 'T'): (0.2, 0.1, 0.9, 3, 4), ('S', 'C', 'T'): (0.4, 0.1, 0.3, 3,1)}
for k, v in x.items():
x[k] = tuple(v[i] * y[i] for i in range(len(y)))
或者(如亚历克斯·霍尔在下面的评论中建议的那样),您可以使用zip
函数,如下所示:
for k in x.keys():
x[k] = tuple(a[0] * a[1] for a in zip(y, x[k]))
我建议您使用上述方法之一,而不要使用原始方法。但是,为了将来参考,出现错误dict has no attribute 'extend'
的原因是extend()
是用于列表的方法,而不是用于字典的方法。当您尝试调用res.extend()
时,会抛出此异常,因为res
是dict
,而不是list
。如果要向一个字典添加多个键/值对,请使用update()
方法。
答案 1 :(得分:1)
您可以在dictcomp中将函数starmap()
与运算符mul
一起使用:
from itertools import starmap
from operator import mul
y = 0.1, 0.2, 0.2, 0.4, 0.1
x = {('S', 'A', 'C', 'T'): (0.2, 0.1, 0.9, 3, 4), ('S', 'C', 'T'): (0.4, 0.1, 0.3, 3, 1)}
{k: tuple(starmap(mul, zip(v, y))) for k, v in x.items()}
# {('S', 'A', 'C', 'T'): (0.020000000000000004, 0.020000000000000004, 0.18000000000000002, 1.2000000000000002, 0.4), ('S', 'C', 'T'): (0.04000000000000001, 0.020000000000000004, 0.06, 1.2000000000000002, 0.1)}
或者您可以使用numpy.multiply()
:
import numpy as np
y = 0.1, 0.2, 0.2, 0.4, 0.1
x = {('S', 'A', 'C', 'T'): (0.2, 0.1, 0.9, 3, 4), ('S', 'C', 'T'): (0.4, 0.1, 0.3, 3, 1)}
{k: np.multiply(v, y) for k, v in x.items()}
# {('S', 'A', 'C', 'T'): array([0.02, 0.02, 0.18, 1.2 , 0.4 ]), ('S', 'C', 'T'): array([0.04, 0.02, 0.06, 1.2 , 0.1 ])}
答案 2 :(得分:0)
我们可以喜欢
from itertools import starmap
import operator
final_dict = { key: list(starmap(operator.mul, zip(value, y))) for key, value in x.items() }
for key, value in final_dict.items():
print(value)