Python - 里面有数学运算的列表

时间:2014-12-06 01:52:13

标签: python list function loops math

如何创建一个函数,该函数采用带有交替数学符号(加号,减号)和整数的列表,然后返回结果。例如,4,'+',5,' - ',1应返回8.

3 个答案:

答案 0 :(得分:1)

我会给你一个班轮。如果这是家庭作业,你的老师会对此提出挑剔的问题。给定

words = [4, '+', 5, '-', 1]

然后

result = sum(digit * (-1 if sign == '-' else 1) for digit, sign in zip(words[0::2], ['+'] + words[1::2]))

我们在这里利用的是你说的只是' +'和' - '操作数。这种类型的数字句子基本上可以重写为(+4) + (+5) + (-1)。换句话说,我们只是将+/-视为符号指示符,然后将它们全部加起来。

分解以上......

# Extract a slice for the digits
digits = words[0::2] # --> [4, 5, 1]
# Extract a slice for the signs
signs = words[1::2]  # --> ['+', '-']
# Our signs needs to have the same size as digits, there's an implicit '+' preceding the first digit
signs = ['+'] + signs # --> ['+', '+', '-']
# use the if else and a list comprehension to build a derived list of numerical signs
numericalSigns = [-1 if each == '-' else 1 for each in signs] # --> [1, 1, -1]
# Use zip to combine the two separate lists into a single list of pairs (tuples)
pairs = list(zip(digits, numericalSigns)) # --> [(4, 1), (5, 1), (1, -1)]
# Use a list comprehension to multiple each tuple
signedDigits = [digit * sign for digit, sign in pairs] # --> [4, 5, -1]
# Use the sum builtin to add them up
sum(signedDigits) # --> 8

答案 1 :(得分:0)

如果您有+-之外的任何内容,那么您要求的内容实际上是模棱两可的。例如,请考虑以下列表:

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

可以评估为9,因为1+2为3,然后3*3为9。

或者它可以评估为7,因为1+2*3是7(因为*比Python中的+更紧密 - 并且在几乎所有代数符号系统中都是如此。


9很容易获得。

首先,您需要知道如何将每个运算符转换为函数。正如Vorticity指出的那样,this answer很好地涵盖了这一点,所以让我们从该答案中借用ops字典。

然后你只需要走清单并做一些每个值的事情。您可以使用规则“字符串是运算符,整数是数字”,或者您可以使用规则“奇数位置是运算符,偶数位数是数字”。我们来看看第一个。

result, op = None, None
for element in func:
    if isinstance(element, int):
        if op:
            result = op(result, element)
        else:
            result = element
    elif isinstance(element, str):
        op = ops[element]
    else:
        raise ValueError('{} is neither an operator nor a number!'.format(element))

要获得7,您必须以某种方式实施operator precedence。这意味着您不能只在看到它时就评估每个操作员;如果您看到[2, '+', 3, …],则实际上您不需要添加23,直到下一个运算符是+-为止(在这种情况下你应该)或*/(在这种情况下你不能)。

解决此问题的一种方法是保留一堆运算符/操作数对,而不是仅保留一个运算符。将每一对推入堆栈,然后,当您看到一个新的运算符(或列表的末尾)时,弹出并处理具有相同或更高优先级的所有操作。

但处理这种情况的通常方法是不要线性地执行此操作,而是编写一个简单的operator-precedence parser,用线性字符串构建树,然后从下往上评估该树。你可以证明(在某些条件下)这两者是等价的,但树只是一种更容易思考事物的方式。

答案 2 :(得分:-1)

这取决于您正在寻找的操作顺序。

1 + 2 * 3可以是9,1 + 2 = 3,3 * 3 = 9(直接操作顺序)

或者可能是7,2 * 3 = 6 + 1 = 7(数学运算顺序)

获取9

items = [1, '+', 2, '*', 3]
last = None
operator = None
for it in items:
    if last == None:
        last = it
    else:
        if it in ["+","*"]: # add others symbol at will, be sure to convert to python symbol
            operator = it
        else:
            last = eval(str(last)+operator+str(it))
print last

输出:

  

9


获取7

这个更简单,只需使用eval:

items = [1, '+', 2, '*', 3]
print eval("".join(str(i) for i in items))

输出:

  

7


顺便说一句,eval不是很安全,恶意用户可以在您的系统中插入令人讨厌的代码。