Вывести сумму строк как число с плавающей запятой

Я работаю над упражнением, в котором говорится:

Позволять s быть строкой, содержащей последовательность десятичных чисел, разделенных запятыми, например, s = '1.23,2.4,3.123', Напишите программу, которая печатает сумму чисел в s,

Мое решение:

s = '1.23,2.4,3.123'
news = s + ","
value = ""
floatValue = 0


for i in range(len(news)):
    if news[i] != ',':
        value += s[i]
    elif news[i] == ',':
        floatValue += float(value)
        value = ""

print floatValue

Мне просто интересно, есть ли более эффективный способ сделать это? Также я нахожусь в начале курса Python, поэтому на данный момент я пытаюсь достичь этого только с помощью решения для начинающих.

6 ответов

Решение

Да, значительно:

>>> s = '1.23,2.4,3.123'
>>> sum(map(float, s.split(",")))
6.753

Это использует str.split разделить строку на числа:

>>> s.split(",")
['1.23', '2.4', '3.123']

map применять float к каждой строке

>>> map(float, s.split(","))
[1.23, 2.4, 3.123]

а также sum складывать итоги.


Поскольку есть несколько ответов с немного разными подходами, я решил проверить их, чтобы найти наиболее эффективные:

2.7.6

>>> import timeit
>>> def f1(s):
    return sum(map(float, s.split(",")))

>>> def f2(s):
    return sum(float(x) for x in s.split(","))

>>> def f3(s):
    return sum([float(x) for x in s.split(",")])

>>> timeit.timeit("f1(s)", setup="from __main__ import f1, f2, f3;s='1.23,2.4,3.123'")
2.627161979675293
>>> timeit.timeit("f2(s)", setup="from __main__ import f1, f2, f3;s='1.23,2.4,3.123'")
2.805773973464966
>>> timeit.timeit("f3(s)", setup="from __main__ import f1, f2, f3;s='1.23,2.4,3.123'")
2.6547701358795166

3.4.0

>>> timeit.timeit("f1(s)", setup="from __main__ import f1, f2, f3;s='1.23,2.4,3.123'")
2.3012791969995305
>>> timeit.timeit("f2(s)", setup="from __main__ import f1, f2, f3;s='1.23,2.4,3.123'")
3.1761953750028624
>>> timeit.timeit("f3(s)", setup="from __main__ import f1, f2, f3;s='1.23,2.4,3.123'")
3.1163038839986257

Бонусный раунд для Ашвини (3.4.0):

>>> from ast import literal_eval
>>> def f4(s):
    return sum(literal_eval(s))

>>> timeit.timeit("f4(s)", setup="from __main__ import f1, f2, f3, f4;s='1.23,2.4,3.123'")
23.054055102998973
>>> timeit.timeit("f1(s)", setup="from __main__ import f1, f2, f3, f4;s='1.23,2.4,3.123'")
2.2302689969983476

Это работает (медленно!), Используя ast.literal_eval интерпретировать строку как кортеж с плавающей точкой:

>>> literal_eval('1.23,2.4,3.123')
(1.23, 2.4, 3.123)
s = '1.23,2.4,3.123'

Коротко и сладко:

print sum(map(float, s.split(',')))

Начальный уровень:

total = 0
for f in s.split(','):
    total += float(f)
print total
s = '1.23,2.4,3.123'

Используйте выражение генератора, чтобы избежать ненужной материализации списка в Python 2 и 3. Это использование обычно вытесняет map благодаря улучшенной читаемости:

sum(float(n) for n in s.split(','))

возвращается

6.7530000000000001

В Python 3 map возвращает итератор, поэтому он имеет примерно одинаковую производительность:

sum(map(float, s.split(',')))

Но в Python 2 он создает ненужный список в качестве промежуточного шага.

Руководства по стилю предпочитают генераторные выражения и списочные выражения map а также filter см . руководство по стилю Google Python, например:

Постижения списков и выражения-генераторы обеспечивают краткий и эффективный способ создания списков и итераторов, не прибегая к использованию map(), filter() или lambda.

Они были созданы с целью уменьшения потребности в map а также filter ,

Ты можешь использовать str.split для разделения строки с , тогда конвертируй любой индекс в float!

>>> sum([float(i) for i in s.split(',')])
6.753

Это можно сделать так:

s = '1.23,2.4,3.123'
val = sum([float(x) for x in s.split(',')])

На мой взгляд, решение уровня Begginer без добавления запятой в конце строки:

      s = '1.23,2.4,3.123'
num=''
sum=0
for i in s:
    if i != ',':
        num+=i
    else:
        sum+=float(num)
        num=''
sum+=float(num) # To add last number which was left out due to no comma.
print(sum)
Другие вопросы по тегам