Как умножить кортеж? - PullRequest
       12

Как умножить кортеж?

0 голосов
/ 23 февраля 2019

Я хочу умножить кортеж.

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 голосов
/ 23 февраля 2019

Вы можете использовать функцию starmap() с оператором mul внутри dictcomp:

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 ])}
0 голосов
/ 23 февраля 2019

Мы можем сделать как следует

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)
0 голосов
/ 23 февраля 2019

Это должно сработать:

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().

...