我得到了下面的python代码,解决了上面的表达式。我相信应该有更通用的Pythonic方法。通用我的意思是它应该解决任何数字组合(不仅仅是:2 ** 2 ** 2 ** 2 ** 0)例如:3 ** 2 ** 4 ** 1 ** 0,3 ** 3 * * 1 ** 2 ** 0等
def get_expo(expo, index, cur_expo):
return int(expo[index-1]) ** cur_expo
def solve_expo(expo):
expo = expo.split("^")
index = len(expo) - 1
cur_expo = int(expo[-1])
result = 0
for i in range(len(expo)):
if index == 1:
result = get_expo(expo, index, cur_expo)
return "Answer is: " + str(result)
else:
cur_expo = get_expo(expo, index, cur_expo)
index -= 1
print solve_expo("2^2^2^2^0")
我需要一种更好的pythonic方法来解决它?
答案 0 :(得分:2)
Python的内置**
运算符已经正确地尊重优先级。您可以用完整的表达方式提供它,并获得您期望的答案。
>>> 3 ** 2 ** 4 ** 1 ** 0
43046721
因此,在用[{1}}替换^
之后评估表达式时,编写函数的直接(但有潜在危险)的方法是这样的:
**
Obviously, eval
might not be suitable for your situation(或者您可能只想做一些更有趣的事情),因此您可以将解决方案重写为递归解决方案。无论如何,它更优雅一点。
def solve_expo(expression):
return eval(expression.replace('^', '**'))
答案 1 :(得分:1)
使用reduce()
函数实现此目的的替代方法:
>>> operation_str = '3^2^4^1^0'
>>> reduce(lambda x, y: int(y)**int(x), operation_str.split('^')[::-1])
43046721
基于分步操作的说明:
>>> operation_str.split('^')
['3', '2', '4', '1', '0'] # Converted str into list
>>> operation_str.split('^')[::-1]
['0', '1', '4', '2', '3'] # Reversed list
>>> reduce(lambda x, y: int(y)**int(x), operation_str.split('^')[::-1])
43046721 # Check reduce() fucntion linked above to know how it works
答案 2 :(得分:0)
由于您希望将其作为递归处理,因此此代码似乎可以很好地处理它。拆分创建一个字符串值列表,然后在递归函数中完全处理。
val = '2^3^4^5^6^7'
vals = val.split('^')
def solve_expo(expo):
if len(expo) == 1:
return int(expo)
else:
return solve_expo(expo[:-1]) ** int(expo[-1])
solv_expo(vals)