2015-12-30 1 views
1

J'ai essayé d'ajouter la virgule valeur seprated entre le : seprated puis multiplier la valeur entière Par exemple, considérez ma valeur est 1,2,3:4,5,6 Je veux ajouter 1 + 2 + 3, et 4 + 5 + 6 multiplier le résultat de cette valeur si la réponse est 6 * 15 = 90pour chacun donne un résultat différent?

Pour mes données ci-dessous, je veux que le résultat est 7.224 mais ce script donne 61.658886435 je ne sais pas quel est le problème dans mon script »

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 

Est-il possible d'obtenir le résultat sans boucle d'itération? Pour le problème ci-dessus

+1

Utilisez manqué la valeur d'initialisation en boucle latérale. – mkHun

+0

Je suis confus par votre exemple. Vous avez dit que vous vouliez multiplier les résultats, mais que vous les avez ensuite ajoutés. Dd vous voulez dire 6 * 15 = 90? – Turn

+0

@Turn Merci pour votre commentaire. Post édité –

Répondre

0

L'utilisation a manqué la valeur d'initialisation comme zéro (x_add = 0) à chaque itération. Donc, votre script ajouter les valeurs précédentes

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 

!!! A partir de @ jpmc26 et @soon comment. Évitez d'utiliser eval et conformez votre format de chaîne d'entrée. Sans bouclage, utilisez regex pour le faire

Utilisez regex pour résoudre votre problème sans boucler.

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

Je ne recommanderais pas 'eval' ici pour des raisons de sécurité – soon

+0

@soon pourquoi? Quelle est la raison? – mkHun

+0

Il évalue une chaîne donnée en tant que code Python. Essayez simplement 'ar =" __import __ ('os.path'). Getcwd() "' – soon

1

Ce problème pourrait également être résolu de manière fonctionnelle:

  1. Vous devez multiplier toutes les valeurs dans la liste - c'est ce que functools.reduce + operator.mul pour

  2. Vous devez résumer toutes les valeurs dans toutes les listes internes - c'est ce que sum pour

Exemple:

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

Quelle est la différence entre functools.reduce et simplement plain vanilla? – Untitled123

+1

@ Untitled123, il n'y a pas de différence, mais "* plain valilla' reduce' * "n'existe plus dans Python 3, seulement en tant que membre' functools' – soon

+0

Ahhh, je vois, merci! – Untitled123

1

Je ne recommande pas nécessairement cette expression compliquée, mais vous pouvez le faire avec compréhensions de liste et éviter les boucles for:

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

Il n'y a pas de raison pour la compréhension des listes, vous pouvez simplement utiliser des expressions de générateur (regardez l'exemple dans mon article) – soon

+0

En effet vous avez raison. – Turn

+0

Sans oublier que votre code est généralement plus concis que le mien. – Turn