要解决的通用Pythonic代码:2 ** 2 ** 2 ** 2 ** 0

时间:2016-09-28 19:48:41

标签: python generics python-3.5

enter image description here

我得到了下面的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方法来解决它?

3 个答案:

答案 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

另请阅读:Why should exec() and eval() be avoided?

答案 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)