使用python3计算列表中几个整数的幂的最佳方法是什么?

时间:2017-03-01 02:44:22

标签: python math python-3.6

所以我所拥有的是一个整数列表,如[2,2,2,3,...,n],列表的长度可以是1到100之间的任何值。我需要做的是计算所有数字的权力。这应该是非常简单的,但也有一个规定,你必须将每个数字提升到下一个数字的幂,以下一个数字的功率,依此类推。例如:如果列表首先包含[2,3,4],我需要计算3 ^ 4的功率然后2 ^(3 ^ 4的答案)。如果列表较长,则需要计算所有列表的值。上面的例子[2,3,4]应该返回2 ^ 81,根据wolfram,它应该像2417851639229258349412352。任何帮助都会很棒,即使它只是一个算法(我可以从中找出代码)我一直在努力想出一个足够的算法一段时间了。

这是我现在的一些代码......

temp = [] 
length = 0

for num in powernumbers:
    for index in num:
        if index.isdigit():
            temp.append(index)
        length = len(temp)
    if length > 0:
        for j in reversed(range(len(temp))):
            _temp = math.pow(int(temp[j-1]), int(temp[j]))
            #THE ABOVE CODE WILL ONLY WORK FOR A LIST OF LEN 2
        print(_temp)
        #needs math.pow(0,(math.pow(1,(math.pow(2,...)))))

print("TEMP:", temp)

再次感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

您可以将functools.reduce与反向列表一起使用:

>>> from functools import reduce
>>> l = [2, 3, 4]
>>> reduce(lambda x, y: y**x, reversed(l))
2417851639229258349412352

reduce有两个参数:function和iterable。然后它将累积应用函数以将可迭代减少到单个值。函数的第一个参数是减值,第二个参数是可迭代的项。由于我们希望以相反的顺序处理列表,因此我们使用reversed,以便首先执行3**4

请注意,在Python 2上reduce是内置的,因此无需导入任何内容。

答案 1 :(得分:2)

>>> numbers = [2,3,4] # your list
>>> result = 1
>>> for n in reversed(numbers):
        result = n**result


>>> result
2417851639229258349412352
>>> 

首先将结果初始化为1,然后以相反的顺序浏览列表,将数字提升到上一个结果,第一次为1,结果为

result = 4**1 -> 4
result = 3**4 -> 81
result = 2**81 -> 2417851639229258349412352

但要注意,这个Nested exponentials会非常快速地增长,并且你更有可能因为疯狂的大数而出现内存错误

>>> result = 1
>>> powers = [2,2,2,2,2,2]
>>> for n in reversed(powers):
        result = n**result


Traceback (most recent call last):
  File "<pyshell#60>", line 2, in <module>
    result = n**result
MemoryError
>>> 

答案 2 :(得分:1)

弹出列表中的最后一个元素,然后向后浏览列表并保持取幂。

powernumbers = [2, 3, 4]
result = powernumbers.pop()
for num in powernumbers[::-1]:
    result = num**result

结果:

>>> result
2417851639229258349412352