使用 python3 计算列表中多个整数的幂的最佳方法是什么?
what is the best way to calculate the power of several ints in a list using python3?
所以我有一个整数列表,例如 [2, 2, 2, 3, ..., n] 列表的长度可以是 1 到 100 之间的任何值。我需要做的是计算所有数字的幂。这应该非常简单,但也有规定,您必须将每个数字的次方提高到下一个数字的次方,依此类推。例如:如果列表首先包含 [2, 3, 4],我需要计算 3^4 的幂,然后是 2^(3^4 的答案)。如果列表更长,则需要计算所有列表的值。根据 wolfram,上面的示例 [2, 3, 4] 应该 return 2^81 应该类似于 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)
再次感谢您的帮助!
您可以将 functools.reduce
与反向列表一起使用:
>>> from functools import reduce
>>> l = [2, 3, 4]
>>> reduce(lambda x, y: y**x, reversed(l))
2417851639229258349412352
reduce
接受两个参数:函数和可迭代对象。然后它将累积应用该函数以将可迭代对象减少为单个值。该函数的第一个参数是减少的值,第二个参数是可迭代的项目。因为我们想以相反的顺序处理列表,所以我们使用 reversed
以便 3**4
将首先执行。
请注意 Python 2 reduce
是内置的,因此无需导入任何内容。
从列表中弹出最后一个元素,然后向后遍历列表并继续求幂。
powernumbers = [2, 3, 4]
result = powernumbers.pop()
for num in powernumbers[::-1]:
result = num**result
结果:
>>> result
2417851639229258349412352
>>> 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, 2, 2, 3, ..., n] 列表的长度可以是 1 到 100 之间的任何值。我需要做的是计算所有数字的幂。这应该非常简单,但也有规定,您必须将每个数字的次方提高到下一个数字的次方,依此类推。例如:如果列表首先包含 [2, 3, 4],我需要计算 3^4 的幂,然后是 2^(3^4 的答案)。如果列表更长,则需要计算所有列表的值。根据 wolfram,上面的示例 [2, 3, 4] 应该 return 2^81 应该类似于 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)
再次感谢您的帮助!
您可以将 functools.reduce
与反向列表一起使用:
>>> from functools import reduce
>>> l = [2, 3, 4]
>>> reduce(lambda x, y: y**x, reversed(l))
2417851639229258349412352
reduce
接受两个参数:函数和可迭代对象。然后它将累积应用该函数以将可迭代对象减少为单个值。该函数的第一个参数是减少的值,第二个参数是可迭代的项目。因为我们想以相反的顺序处理列表,所以我们使用 reversed
以便 3**4
将首先执行。
请注意 Python 2 reduce
是内置的,因此无需导入任何内容。
从列表中弹出最后一个元素,然后向后遍历列表并继续求幂。
powernumbers = [2, 3, 4]
result = powernumbers.pop()
for num in powernumbers[::-1]:
result = num**result
结果:
>>> result
2417851639229258349412352
>>> 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
>>>