如何采取的总和时,“+”是存在?

问题描述 投票:0回答:7

我与修复后的符号和堆栈的工作,我想知道是否/如何我可以总结一个列表中的元素,叠加等当字符串“+”存在?

对于这个例子,我只是将使用一个列表,而不是一个栈(但如果你有堆栈的解决方案,通过各种手段继续)。

所以,也许如果我有:

string = '1 2 3 +'

并且变成了榜单:

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

如果正确的话将评估为:

6

这是我原以为会工作(注:有效()函数我做了检查,如果它是可以改变为基于断弦的浮动它的正常工作。):

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 *”,但如果你有一个解决方案,这将是大加赞赏。

python string stack postfix-notation
7个回答
3
投票

您评估使用堆栈后缀符号。当你看到一个数字,你把它压入堆栈。当你看到一个运营商,你去歇够数量,以满足并推动的结果。最后,堆栈应该只有一个项目,你打印出来。

现在通常+是一个二元运算符:它需要两个操作数。你的情况,你希望它消耗无论是在栈上。这对+一个非常规的意义,但它是很简单的实现。

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())

1
投票

这里有几个问题。首先是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
投票
the_list = ['1','2','3','+'] 
if '+' in the_list:
    #do things related to it being present

我相信,你甚至不需要将其转换为一个列表(尽管它可能使数字的后续处理更容易)。就像是:

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

应该执行,同时,因为字符串作为蟒蛇iterables处理


0
投票
lst = string.split()
if '+' in lst:
    # Do addition
elif '-' in lst:
    # Do subtraction

0
投票

你不能只是采取的总和,因为该列表是字符串格式,而“+”永远是一个字符串,所以:

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
投票

执行以下操作,应适用于另外的是你的字符串的最后一个值的情况下(+)。您可以添加附加条件到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
投票

试着这样做:

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下面的列表理解的方法来诠释:

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

这将防止ValueError异常而变换元件为int进一步计算

© www.soinside.com 2019 - 2024. All rights reserved.