2017-12-13 45 views
0

リスト内でn番目の項 - (n-1)番目の項を見つける方法を知りたいと思います。私はそれが非常にシンプルでなければならないことを知っていますが、私はただアプリケーションに問題があります。したがって、入力が[0, 2, 4, 6, 5]の場合、関数は[0, 2, 2, 2, -1]を返します。私の解決策(うまくいかない)は以下の通りです:Pythonでn番目(n-1)番目の項を取る方法は?

def cost_to_diff (stocks): 
    for i in range(i+1): 
     stock[i] = stock[i] - stock[i-1] 
     print stock 

なぜこれは意図したとおりに機能しませんか?

+0

が重複する可能性 - https://stackoverflow.com/questions/24614361/finding-the-difference-between-consecutive-numbers-in-a-list-python#24742315 – GaneshTata

+0

どのようにあなたが '私の中に思いました範囲(i + 1) 'はうまくいくでしょうか? –

+2

[リスト内の連続する数字の違いを見つける(Python)](https://stackoverflow.com/questions/24614361/finding-the-difference-リスト間の連続番号-python) – styvane

答えて

2

あなたの間違いは、リストのi番目の要素をリセットしているため、次のサイクルの反復で変更された値にアクセスすることです。

これはあなたがリストを印刷したい場合は、

def cost_to_diff (stocks): 
    diff = [] 
    for i in range(1, len(stocks)): 
     diff.append(stocks[i] - stocks[i-1]) 
    print diff 

または

def cost_to_diff (stocks): 
    print [stocks[i] - stocks[i-1] for i in range(1, len(stocks))] 

を行う。また私はnumpyをしようとするあなたをアドバイス

def cost_to_diff (stocks): 
    for i in range(1, len(stocks)): 
     print stocks[i] - stocks[i-1] 

が必要なものを出力しますそのような仕事。 This functionがその仕事をします。特に在庫データを再生している場合、numpyはリストよりもはるかに高速です。また、在庫データの場合は通常データフレームを使用しますので、pandasが勉強する必要があり、Series.diffが必要な機能です。

0

間違った範囲を使用しています。あなたは株式リストの長さを見つけ、それに応じて範囲を構築する必要があります。

differences = [] 
for i in range(len(stocks) - 1): 
    differences.append(stock[i+1] - stock[i]) 
    print differences 

ただし、これを行うより良い方法があります。 Pythonには、この種の処理を簡単に行うための組み込み関数がいくつかあります。 zip関数を使用すると、インデックスを邪魔することなく要素を取得できます。例えば

differences = [] 
for a, b in zip(l, l[:1]): 
    differences.append(b-a) 

my_list = [0, 3, 4, 5, 7] 
print zip(my_list, my_list[1:]) 

これは、あなたが後にする必要があるすべての要素を減算した出力

[(0, 3), (3, 4), (4, 5), (5, 7)] 

を生成します。

+0

あとで以前の 'stock'値を必要としないと仮定するとエレガントになります –

+0

これはリスト**のインプレース**を変更し、これを - [[2,2、2、-1、5]'の代わりに'[0、2、2、2、-1]'である。 – GaneshTata

+0

あなたが正しいです、その問題を解決するために私の答えを編集しました。 –

0

次のコードは、最初の要素が0になる理由がわからないため、[2, 2, 2, -1]を返します。

最初の-1要素も0であるとしますか?

len('list')はあなたにリストの長さを与えます。

range(start, end)はあなたに範囲を与えます。

2番目の要素(index = 1)のforループで反復を開始したいので、startは1になり、endはストックリストの長さになります。

stock = [0,2,4,6,5] 
result = []#create an empty list for the results 
for i in range(1,len(stock)):#set the iteration steps, will be 1,2,3,4 in this case 
    result.append(stock[i] - stock[i-1])#By using stack[i] = ... you will overwrite the ith element 
print result 
関連する問題