如何将列表中每个值的指数幂相加

5

我该如何在 Python 3 中将列表中每个数的指数幂值相加?

示例:

[3, 0, 2] = 3^1 + 0^2 + 2^3 = 11

这个想法是为列表中任意可能的非负数组合创建一个唯一的索引。这样,我可以使用该列表计算某物的索引。


编辑:虽然问题已经得到了回答,但我刚意识到该方法并没有为列表中任意组合的非负整数创建唯一的索引。为了做到这一点,可以假设a是可能整数的数量,并且基于接受的答案进行操作。

sum(a ** i * j for i,j in enumerate(l, 0))

这个想法是,每个数字都将指数按其在列表中的位置成比例指数增加。假设 a=4(从 03),上述示例变为:

[3, 0, 2] = 4^0*3 + 4^1*0 + 4^2^2 = 35

索引范围为04^3-1=63


嗯,这个编辑可能会让问题和答案更加混乱。另外,enumerate(list, 0)是不必要的 :-) 默认情况下,enumerate(list)0 开始索引。 - Dimitris Fasarakis Hilliard
2个回答

8
使用enumerate获取索引并将其提供给sum函数:
sum(j ** i for i,j in enumerate(l, 1))

通过将 enumeratestart 参数指定为 1,可以确保索引从 1 开始(正如您所希望的),而不是从 0 开始(这是使用普通的 enumerate 命令时的默认值):

>>> l = [3, 0, 2]    
>>> sum(j ** i for i,j in enumerate(l, 1))
11

在函数式思想中,您还可以使用mapcount结合使用,从itertools中传入pow作为被映射的函数:

>>> from itertools import count
>>> sum(map(pow, l, count(1)))
11

这两种方法的执行时间几乎相同;不过,使用生成器表达式来求和会略微提供一些灵活性。


1
你可以使用numpy来完成这个任务,它通常比遍历列表更快:
In [1]: import numpy as np

In [2]: l = [0, 3, 4, 1]

In [3]: np.array(l) ** np.arange(len(l))
Out[3]: array([ 1,  3, 16,  1])

In [4]: np.array(l) ** np.arange(1, len(l) + 1)
Out[4]: array([ 0,  9, 64,  1])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接