如何在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
(从0
到3
),上面的示例变为
[3, 0, 2] = 4^0*3 + 4^1*0 + 4^2^2 = 35
指数范围从0
到4^3-1=63
。
答案 0 :(得分:8)
sum(j ** i for i,j in enumerate(l, 1))
将start
enumerate
参数指定为1
,确保索引将从1
(根据需要)开始,而不是从0
开始(默认为你得到一个普通的enumerate
):
>>> l = [3, 0, 2]
>>> sum(j ** i for i,j in enumerate(l, 1))
11
在功能上,您还可以使用map
count
itertools传递pow
{{3}}作为要映射的函数:
>>> from itertools import count
>>> sum(map(pow, l, count(1)))
11
这些几乎在同一时间执行;生成器表达式sum
虽然提供了一点灵活性。
答案 1 :(得分: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])