Уведомления

Группа в Telegram: @pythonsu

#1 Май 31, 2013 19:15:14

pall
Зарегистрирован: 2013-05-31
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вычислить выражение в строке?

Задача
Дана строка вида “12-23+343+322” (арифметическое выражение, состоящее из цифр и знаков + и -, при этом два знака не идут подряд и выражение завершается цифрой). Вычислите его значение.

а вот ужас

s=“12-23+343+322”
i=1
while i<=len(s):
if (s=“+” or “-”)) and (s>=0 and s<=9) and (s>=0 and s<=9):
c=s
j=i-1
k=1
s1=“”
while (s>=0 and s<=9) and j>=1:
s1=s+s1
j=j-1
k=k+1
j=j+1
s2=“”
while (s>=0 and s<=9) and j<=len(s):
s2=s2+s
j=j+1
k=k+1
p=int(s1)
t=int(s2)
if s==“-”:
r=p-t
if s==“+”:
r=p+t
print s1,c,s2,“=”,r
i=i+k
else:
i=i+1
raw_input()

примечание eval не использовать

Офлайн

#2 Май 31, 2013 20:51:48

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Как вычислить выражение в строке?

pall
eval не использовать
s='12-23+343+322'
exec('print ' + s)

Офлайн

#3 Май 31, 2013 21:44:22

pall
Зарегистрирован: 2013-05-31
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вычислить выражение в строке?

нее, учус'ом тоже нельзя
вот решение на паскале
я не смог его адаптировать под
питон
uses crt;
const cf=;
zn=;
var s,s1,s2:string;
i,k,j:byte;
res:longint;
t,q,p:integer;
c:char;
begin
clrscr;
writeln('Введите строку, содержащую арифметические выражения со знаками +,-,*,/');
readln(s);
i:=1;
while i<=length(s) do
{если знак между цифрами}
if (s in zn)and(s in cf)and(s in cf) then
begin
c:=s;{запомним знак}
j:=i-1;k:=1;{идем назад}
s1:='';
while (s in cf)and(j>=1) do
begin
s1:=s+s1;{составляем строку из первого числа}
j:=j-1;
k:=k+1;
end;
j:=i+1;k:=1;{идем вперед}
s2:='';
while (s in cf)and(j<=length(s)) do
begin
s2:=s2+s;{составляем строку-второе число}
j:=j+1;
k:=k+1;
end;
val(s1,t,p);{преобразуем в числовой формат}
val(s2,q,p);
case c of{выполняем действие}
‘+’:res:=t+q;
‘-’:res:=t-q;
‘*’:res:=t*q;
‘/’:res:=t div q;
end;
writeln(s1,c,s2,'=',res);{выводим}
i:=i+k;{перепрыгиваем через второе число}
end
else i:=i+1;{иначе идем вперед}
readln
end.

Офлайн

#4 Май 31, 2013 22:00:52

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Как вычислить выражение в строке?

Не зря запрещали студентам голову бэйсиками забивать.

from operator import __sub__, __add__
from functools import reduce
import re
expr = '12-23+343+322'
opf = {'+':__add__, '-':__sub__}
vals = list(map(int, re.split('[+-]', expr)))
opl = iter(filter(lambda x:x in '+-', expr))
print(reduce(lambda x, y: opf[next(opl)](x, y), vals))

Офлайн

#5 Июнь 1, 2013 05:21:34

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Как вычислить выражение в строке?

Shaman
list и iter - лишнее



Офлайн

#6 Июнь 1, 2013 08:35:14

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Как вычислить выражение в строке?

pyuser
list и iter - лишнее
Спасибо за внимательность. list явно указан умышленно, а iter действительно рудимент.

Офлайн

#7 Июнь 1, 2013 19:24:44

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Как вычислить выражение в строке?

В порядке бреда:

import re
expr = '12-23+343+322'
vals = re.split('[+-]', expr)
opl = re.split('\d+', expr)[1:-1]
print(sum(map(lambda x, y: int(y+x), vals, ['+']+opl)))

Отредактировано Shaman (Июнь 1, 2013 19:25:12)

Офлайн

#8 Июнь 3, 2013 11:37:33

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Как вычислить выражение в строке?

Shaman
В порядке бреда:
Тоже поучаствую…
import re
expr = '12-23+343+322'
print sum(map(int, re.findall(r'([+-]?\d+)', expr)))

Офлайн

#9 Июнь 3, 2013 18:50:46

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Как вычислить выражение в строке?


expr = '12-23+343+322'
def gv(expr):
    v = ''
    for c in reversed(expr):
        v = c + v
        if not c.isdigit():
            yield int(v)
            v = ''
    yield int(v)
print(sum(gv(expr)))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version