2015-12-30 5 views
1

Я пытался добавить запятую seprated значение между : seprated затем умножить все значения Для примера рассмотрим мое значение является 1,2,3:4,5,6 Я хочу добавить 1 + 2 + 3 и 4 + 5 + 6 умножить результат это значения, так ответ 6 * 15 = 90для каждого дает отличный результат?

Для моего сильфона данных я хочу результат 7.224, но этот сценарий дает 61.658886435 я не знаю, что это проблема в моем сценарии»

ar = "0.212,1.231,0.112:1.001,3.212,0.002:0.002,0.0001,1.1" 
x_data = ar.split(":") 
x_final = 1 
x_add = 0 
for i in x_data: 
    x_each = i.split(",") 
    for j in x_each: 
     x_add = x_add + float(j) 
    x_final = x_add * x_final 

print x_final 

Можно ли получить результат без повторения цикла? Для вышеуказанной задачи

+1

Используйте пропущенное значение инициализации в стороне зацикливании. – mkHun

+0

Я смущен вашим примером. Вы сказали, что хотите умножить результаты, но затем добавили их. Вы имеете в виду 6 * 15 = 90? – Turn

+0

@Turn Спасибо за ваш комментарий. Сообщение отредактировано –

ответ

0

Использовать пропущенное значение инициализации как ноль (x_add = 0) в каждой итерации. Так что ваш сценарий добавить с предыдущими значениями

ar = "0.212,1.231,0.112:1.001,3.212,0.002:0.002,0.0001,1.1" 
x_data = ar.split(":") 
x_final = 1 
for i in x_data: 
    x_each = i.split(",") 
    x_add = 0    # Here you not initialize it 
    for j in x_each: 
     x_add = x_add + float(j) 
    x_final = x_add * x_final 

print x_final 

!!! Как от @ jpmc26 и @ comment. Избегайте использования eval и совместите свой формат входной строки. Без циклического использования используйте регулярное выражение для этого

Используйте regex для решения проблемы без зацикливания.

ar = "0.212,1.231,0.112:1.001,3.212,0.002:0.002,0.0001,1.1" 
import re 
ar = "("+ar      #Add the (with your data 
ar = re.sub(r",","+",ar)   #Substitute with + instead of , 
ar = re.sub(r"(?=\:|$)",")",ar) #look ahead for add `)` after colon 
ar = re.sub(r"(?<=)\:","*(",ar) #Replace the color with * 

#NOw you data look likes(0.212+1.231+0.112)*(1.001+3.212+0.002)*(0.002+0.0001+1.1) 
#Finally evaluvate the string as a expression 
print eval(ar) 
+0

Я бы не рекомендовал 'eval' здесь по соображениям безопасности – soon

+0

@soon почему? В чем причина? – mkHun

+0

Он оценивает данную строку как код Python. Просто попробуйте 'ar =" __import __ ('os.path'). Getcwd() "' – soon

1

Эта проблема может быть также решена в функциональном образом:

  1. Вы должны умножить все значения в списке - это то, что functools.reduce + operator.mul для

  2. Вы должны суммировать все значения во всех внутренних списках - это то, что sum для

Пример:

In [5]: ar = "0.212,1.231,0.112:1.001,3.212,0.002:0.002,0.0001,1.1" 

In [6]: import operator 

In [7]: import functools 

In [8]: functools.reduce(operator.mul, (sum(float(x) for x in s.split(',')) for s in ar.split(':'))) 
Out[8]: 7.223521582500001 
+0

В чем разница между functools.reduce и простой ванилью? – Untitled123

+1

@ Untitled123, нет никакой разницы, но «* plain valilla' reduce' * "больше не существует в Python 3, только как член' functools' – soon

+0

Ahhh, я вижу, спасибо! – Untitled123

1

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

import operator 

ar = "0.212,1.231,0.112:1.001,3.212,0.002:0.002,0.0001,1.1" 
reduce(operator.mul, [sum([float(n) for n in e]) for e in [x.split(',') for x in ar.split(":")]], 1) 
+0

Нет причин для понимания списков, вы можете просто использовать выражения генератора (см. Пример в моем сообщении). – soon

+0

Действительно, вы правы. – Turn

+0

Не говоря уже о том, что ваш код, как правило, более краткий, чем мой. – Turn

Смежные вопросы