2017-09-17 17 views
2

私は自分のPythonコードのある時点で混乱しています。私は累積合計を返すプログラムを構築しようとしています。つまり、i番目の要素はorigianリストの最初のi + 1要素の太陽です。だから、[1,2,3]の総和は[1,3,6]です。プログラムとその作業を構築しようとしましたが、最初の要素の最後の要素を前の要素として追加すると、それはPythonリストの構造何か円?Pythonリストは循環データ構造ですか?

h=[] 
a=[1,2,3,4,5,6] 
for i in range(len(a)): 
    d=a[i]+(a[i-1]+1) 
    h.append(d) 

print(h) 

結果

[8, 4, 6, 8, 10, 12] 
+1

累積値で別の変数を保持する必要があります。入力リストの前の要素からだけ計算することはできません。 –

+0

おそらく、現在の要素を 'a'から取り出し、前の要素を' h'から取り出し、合計を集めることを意図していました。しかし、それは 'h'が空であるアルゴリズムを起動するという明確な問題を持っています。したがって、パウロが言及したように別の変数を保持するのが最も簡単な方法です。 –

+0

いいえ、 "構造"は円形ではありませんが、*負のインデックスは背面からのインデックス*です。私。 'my_list [len(my_list) - 1] == my_list [-1]' –

答えて

3

犯人は0 番目の繰り返しでa[i - 1]である:実際に何が起こる

d = a[i] + (a[i - 1] + 1) 

i - 1-1に減少することである、とPythonで、 a[-1]はリストの最後の要素を指します。

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

In [569]: l[-1] 
Out[569]: 4 

ここソリューションはまた、あなたがmentioned hereとして、一時変数の使用を検討する1からあなたのループを開始するには、次のようになります。

側として
a = [1, 2, 3, 4, 5, 6] 
h = [] 
cumsum = 0 
for i in a: 
    cumsum += i 
    h.append(cumsum) 

print(h) 
[1, 3, 6, 10, 15, 21] 

numpyを使用している場合、np.cumsumという単一の関数呼び出しと同じくらい簡単です:

h = np.cumsum([1, 2, 3, 4, 5, 6]) 
print(h) 
array([ 1, 3, 6, 10, 15, 21]) 
0

はい - これは少し似ています。 Pythonでは、a [-1]はリストの最後の要素を返します。あなたが最初の項目で結果をシードした場合

あなたのコードとは1ではなく0から始めるには、動作させることができます。

a=[1,2,3,4,5,6] 
h=[a[0]] 
for i in range(1,len(a)): 
    d=a[i]+(h[i-1]) 
    h.append(d) 

print(h) 
0

リストは円形ではなく、どちらかの先頭またはから参照することができます終わり。リストの最後から[-1]を使用して参照することができます。

ただし、10個の要素しかないリストの20番目の要素を参照しようとすると、エラーが発生します。リストが円形であれば、それは10番目の要素を参照しますが、リストはそれを参照しません。何をしたい

はこれです、私は信じている:

a = [1,2,3,4,5,6] 
h = [] 

index = 0 
for i in range(len(a) - 1): 
    first = a[index] 
    second = a[index + 1] 
    summation = first + second 
    h.append(summation) 
    index += 1 

print(h) 
1

はちょうどあなたが、この場合には、二項演算の結果を蓄積するために追加をitertools.accumulateを使用することができることを追加したいです。さらにに、itertools.accumulate実際デフォルトを注意:

>>> a = [1, 2, 3, 4, 5, 6] 
>>> a = [1, 2, 3, 4, 5, 6] 
>>> import itertools 
>>> list(itertools.accumulate(a)) 
[1, 3, 6, 10, 15, 21] 

しかし、あなたはそれをバイナリ操作を渡し、累積製品を行う、例えば可能性:

>>> list(itertools.accumulate(a ,lambda x, y: x*y)) 

いっそのこと、operatorのパワーを活用モジュール:

>>> list(itertools.accumulate(a, operator.add)) #cumulative sum 
[1, 3, 6, 10, 15, 21] 
>>> list(itertools.accumulate(a, operator.mul)) #cumulative product 
[1, 2, 6, 24, 120, 720] 
>>> list(itertools.accumulate(a, operator.truediv)) #cumulative quotient 
[1, 0.5, 0.16666666666666666, 0.041666666666666664, 0.008333333333333333, 0.001388888888888889] 
>>> list(itertools.accumulate(a, operator.floordiv)) #cumulative floor div 
[1, 0, 0, 0, 0, 0] 
関連する問題