Умножение списка элементов из словаря - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть словарь, который содержит список из двух чисел каждое.Мне нужно умножить эти числа вместе и сохранить промежуточную сумму для всех ключей в словаре.Я получаю сообщение об ошибке TypeError:

sub = v1 * v2
TypeError: can't multiply sequence by non-int of type 'list'

Я пытался разыграть его с плавающей точкой, но затем получаю:

v1= float(c.get(k,v[0]))
TypeError: float() argument must be a string or a number, not 'list'

Код ниже:

change = {'penny': [.01,57], 'nickel':[.05,34],'dime':[.1,42], 'quarter':  [.25,19],'half dallar':[.5,3],'one dollar bill':[1,24],'five dollar bill':[5,7],'ten dollar bill':[10,5],'twenty dollar bill':[20,3]}

def totalAmount(c):
   total = 0
   for k, v in c.items():
       v1= c.get(k,v[0])
       v2= c.get(k,v[1])

       sub = v1 * v2
       total = total + sub


totalAmount(change)
print("Total in petty cash: $" + total)

Ответы [ 5 ]

0 голосов
/ 17 февраля 2019
total = sum(v1 * v2 for v1, v2 in change.values())
0 голосов
/ 17 февраля 2019
[change[key][0]*change[key][1] for key in change.keys()]
0 голосов
/ 17 февраля 2019

Второй параметр метода dict.get предназначен для значения по умолчанию, а не для дальнейшего извлечения значения.

Вместо этого вы можете распаковать значения подсписков следующим образом:

for k, (v1, v2) in c.items():
    sub = v1 * v2
    total = total + sub
0 голосов
/ 17 февраля 2019

Попробуйте:

change = {'penny': [.01,57], 'nickel':[.05,34],'dime':[.1,42], 'quarter':  [.25,19],'half dallar':[.5,3],'one dollar bill':[1,24],'five dollar bill':[5,7],'ten dollar bill':[10,5],'twenty dollar bill':[20,3]}

def totalAmount(c):
   total = 0
   for k, v in c.items():
       sub = v[0] * v[1]
       total = total + sub
   return total


t = totalAmount(change)
print(t)

будет иметь значение

181.72

, а проблема с вашим кодом - v1= c.get(k,v[0]).Вы должны изменить его на v1= c.get(k)[0], если хотите использовать get, но когда вы используете .items(), вам не нужно использовать get.v будет тем желаемым массивом в каждой итерации.

0 голосов
/ 17 февраля 2019
v1= c.get(k,v[0])
v2= c.get(k,v[1])

В этой ситуации v1 и v2 оба устанавливаются на v.c.get(i) возвращает c[i], поэтому c[k] будет естественно возвращать соответствующее значение v.Вместо этого просто разбейте свой список следующим образом:

v1, v2 = v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...