如何创建一个函数,该函数采用带有交替数学符号(加号,减号)和整数的列表,然后返回结果。例如,4,'+',5,' - ',1应返回8.
答案 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, …]
,则实际上您不需要添加2
和3
,直到下一个运算符是+
或-
为止(在这种情况下你应该)或*
或/
(在这种情况下你不能)。
解决此问题的一种方法是保留一堆运算符/操作数对,而不是仅保留一个运算符。将每一对推入堆栈,然后,当您看到一个新的运算符(或列表的末尾)时,弹出并处理具有相同或更高优先级的所有操作。
但处理这种情况的通常方法是不要线性地执行此操作,而是编写一个简单的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
不是很安全,恶意用户可以在您的系统中插入令人讨厌的代码。