Вывести сумму строк как число с плавающей запятой
Я работаю над упражнением, в котором говорится:
Позволять
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)