如何将元组相乘?

时间:2019-02-23 07:35:46

标签: python tuples multiplication

我想乘一个元组。

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'的错误。

3 个答案:

答案 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()时,会抛出此异常,因为resdict,而不是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)