Как взять сумму, когда присутствует «+»? - PullRequest
0 голосов
/ 08 февраля 2019

Я работаю с нотациями и стеками после исправления, и мне интересно, можно ли / как суммировать элементы списка, стека и т. Д. При наличии строки '+'?

Для примера я просто собираюсь использовать список вместо стека (хотя, если у вас есть решение для стека, во что бы то ни стало).

Итак, возможно, если бы у меня было:

string = '1 2 3 +'

и превратил это в список:

['1','2','3','+']

, если правильно будет вычислено:

6

Вот то, что я думал, будет работать (Примечание: Функция valid (), которую я сделал, проверяет, может ли она быть преобразована в число с плавающей точкой на основе строки. Работает нормально ):

def post_fix(string):
     lst = []
     for i in string:
         if '(' in lst:
             pass
         elif valid(i) is True:      
             int(i)
             lst.append(i)
         elif '+' in string:
             '+' == sum(lst)
             print(sum(lst))

  post_fix('1 2 3 +')

Как я могу заставить это работать так, чтобы, если '+'или' - 'и т. д., он будет выполнять соответствующую операцию?

Примечание: Для простоты вы можете просто предположить, что оператор всегда будет в конце.Так что не беспокойтесь о чем-то вроде «12 + 34 *», хотя, если у вас есть решение для этого, это будет высоко ценится.

Ответы [ 7 ]

0 голосов
/ 08 февраля 2019

Выполнение следующих действий должно работать в случае, когда сложение (+) является последним значением вашей строки.Вы можете добавить дополнительные условия к методу post_fix, затем для -, *,% и т. Д .:

def post_fix(string):
    result = None
    split_string = string.split()
    if '+' == split_string[-1]:
        result = sum(map(int, filter(lambda x: x.isdigit(), split_string)))
    return result

Просто разбить эту строку на случай, если она неясна:

filtered_digits = filter(lambda x: x.isdigit(), split_string)  # Checks if the string is a digit and adds it to the filtered_digits list
casted_to_int = map(int, filtered_digits)  # Casts all values found to be str representation of ints to int through the map function
result = sum(casted_to_int)  # sums our list of integers
0 голосов
/ 08 февраля 2019

Попробуйте сделать это:

mystr = "1 2 3 4 +"
mylst = mystr.split() #converts the string to list:  ['1', '2', '3', '+']
nums = [ int(i) for i in mylst[:-1]] #list of numbers

if mylst[-1] == "+":  #check for the sign present at the end of the string/list
  print(sum(nums))

nums2 = ['1', '2', '3', '4']
print(sum(nums2))

Если знак не в конце, попробуйте преобразовать str в int, используя следующий метод понимания списка:

nums = [ int(i) for i in mylst if i in "1234567890"]

Это предотвратит ValueErrorпреобразование элементов в int для дальнейших вычислений

0 голосов
/ 08 февраля 2019

Вы оцениваете постфиксную нотацию, используя стек.Когда вы видите число, вы помещаете его в стек.Когда вы видите оператора, вы выскакиваете достаточно цифр, чтобы удовлетворить его, и выдвигаете результат.В конце в стеке должен быть только один элемент, и вы печатаете его.

Теперь обычно + - это двоичный оператор: он принимает два операнда.В вашем случае вы хотите, чтобы он потреблял все, что находится в стеке.Это необычное значение для +, но его достаточно просто реализовать.

def postfix(tokens):
    stack = []
    tokens = tokens.split() if isinstance(tokens, str) else tokens
    for token in tokens:
        if token.isdigit() or token.startswith("-") and token[1:].isdigit():
            stack.append(int(token))
        elif token == "+":
            assert stack    # need at least one item
            result = 0
            while stack:
               result += stack.pop()
            stack.append(result)
        else:
            raise ValueError("invalid token {}".format(token))
    assert len(stack) == 1
    return stack[0]

print(postfix("1 2 3 +"))

Эта структура легко расширяется для обработки других операций.Например, вы можете использовать + для двоичного сложения и ++ для суммирования всех.

elif token == "++":   # sum all
    result = 0
    while stack:
       result += stack.pop()
    stack.append(result)
elif token == "+":    # binary additon
    stack.append(stack.pop() + stack.pop())
0 голосов
/ 08 февраля 2019

Вы не можете просто взять сумму, так как список в строковом формате, и «+» всегда будет строкой, поэтому:

if "+" in lst:
    total = sum([int(i) for i in lst if not i == "+"])

Как функция:

def sum_list(x):
    if "+" in x:
        total = sum([int(i) for i in x if not i == "+"])
    return total
0 голосов
/ 08 февраля 2019

Здесь есть несколько проблем.Первый - int(i).Это не создает копию i как целое число, но не изменяет i вообще.i, который вы добавляете в список, все еще является строкой.Вторая проблема заключается в том, что это не работает для двухзначных чисел - вы сразу добавляете в список вместо отслеживания возможных двухзначных чисел.

Исправление этих проблем:

def valid(i):
  return i.isdigit()

def post_fix(string):
  lst = [0]
  for i in string:
    if i == '(':
      continue
    elif i == ' ':
      lst.append(0)
    elif valid(i):      
      lst[-1] *= 10
      lst[-1] += int(i)
    elif i == '+':
      print(sum(lst))

post_fix('1 2 3 +')

Выход:

6
0 голосов
/ 08 февраля 2019
lst = string.split()
if '+' in lst:
    # Do addition
elif '-' in lst:
    # Do subtraction
0 голосов
/ 08 февраля 2019
the_list = ['1','2','3','+'] 
if '+' in the_list:
    #do things related to it being present

Я считаю, что вам даже не нужно преобразовывать его в список (хотя это может упростить последующую обработку чисел).Что-то вроде:

if '+' in '1 2 3 +':

также должно выполняться, потому что строки обрабатываются как итерационные в pyton

...