2016-11-16 8 views
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)) 

アイデアは、各番号は、リスト内のその位置に指数関数的に比例した量だけ指数を増加することです。 (0から3に)a=4を仮定すると、上記の例では、インデックスは0から4^3-1=63の範囲であろう

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

となります。 sumにすることを指標と供給を得るために

+0

フム、編集(元の質問と答えについて)それが役立つと多くを混乱させる可能性があります。また、 'enumerate(list、0)'は必要ありません:-) 'enumerate(list)'はデフォルトで '0'からのインデックスを開始します。 –

答えて

8

使用enumerate

sum(j ** i for i,j in enumerate(l, 1)) 

enumeratestart引数を指定する1としては、インデックスは0から1から開始(あなたが望むように)しません保証(デフォルトましたあなたは普通のenumerateとなります):

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

機能的な精神では、マッピングする関数としてpow渡しitertoolsからcountmapを利用する:

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

これらかなり略で同時に実行。ジェネレータの表現はsumになりますが、柔軟性のわずかな利点があります。

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]) 
関連する問題