1

このデータを含むstock_dataというリストがあります:

['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close\n2013-06-28', '874.90', '881.84', '874.19', '880.37', '2349300', '880.37\n2013-06-27', '878.80', '884.69', '876.65', '877.07', '1926500', '877.07\n2013-06-26', '873.75', '878.00', '870.57', '873.65', '1831400', '873.65\n2013-06-25', '877.26', '879.68', '864.51', '866.20', '2553200', '866.20\n2013-06-24', '871.88', '876.32', '863.25', '869.79', '3016900', '869.79\n2013-06-21', '888.34', '889.88', '873.07', '880.93', '3982300', '880.93\n2013-06-20', '893.99', '901.00', '883.31', '884.74', '3372000', '884.74\n']

私が見つけた上のリストの終値のみが、上のリストの要素 10 から始まる 6 番目の要素ごとである、cloning_prices という名前の新しいリストを作成したいと思います。

これまでの私のコードは次のとおりです。

stock_data = []
for line in data:
        stock_data.append(line)

closing_prices= []
count = 10
for item in stock_data:
    closing_prices.append(stock_data[count])
    print (closing_prices)
    count = count + 6

これにより、次の結果が得られます。

['880.37']
['880.37', '877.07']
['880.37', '877.07', '873.65']
['880.37', '877.07', '873.65', '866.20']
['880.37', '877.07', '873.65', '866.20', '869.79']
['880.37', '877.07', '873.65', '866.20', '869.79', '880.93']
['880.37', '877.07', '873.65', '866.20', '869.79', '880.93', '884.74']
Traceback (most recent call last):
  File "C:\Users\Usman\Documents\Developer\Python\Pearson Correlation\pearson_ce.py", line 34, in <module>
    closing_prices.append(stock_data[count])
IndexError: list index out of range

明らかに私が欲しいのは最後の行です:

['880.37', '877.07', '873.65', '866.20', '869.79', '880.93', '884.74']

しかし、リストのインデックスが範囲外であることに頭を悩ませていました。なぜなら、stock_data で x を実行すると、問題なく最後に到達するまでリストを通過するだけだと思ったからです。なぜインデックスから外れるのですか?

Python 3、ありがとう。

4

4 に答える 4

4

最初の 7 回の繰り返しで、明らかに期待どおりの結果が得られます。しかし、7 回目の繰り返しが完了した後でも、for ループはリスト内のさらに多くの要素のうち 7 つしかトラバースしていないため、アクセスを試みますstock_data[10+6*7]。あなたがおそらく意味したことは次のとおりです。

closing_prices = stock_data[10::6]

stock_data[a:b:c]stock_dataindex で始まり、 indexまで (ただし index を含まない) 番目の要素aごとに取得するサブリストを返します。指定しない場合、デフォルトで、、 になります。これはスライシングと呼ばれます。cba=0c=1b=(length of the list)

于 2013-06-29T23:34:25.567 に答える
3
# for splitting adj-close/date @ the newlines
stock_data = [ y for x in stock_data for y in x.split('\n') ]
headers = { k:i for i,k in enumerate(stock_data[:7]) }
# convert stock_data to a matrix
stock_data = zip(*[iter(stock_data[7:])]*len(headers))
# chose closing column
closing = [ r[headers['Close']] for r in stock_data ]
print closing

出力:

['880.37', '877.07', '873.65', '866.20', '869.79', '880.93', '884.74']
于 2013-06-29T23:48:46.980 に答える
1

簡単な修正は、追加を try catch ステートメントでラップすることです。

for item in stock_data:
    try:
        closing_prices.append(stock_data[count])
    except IndexError:
        break
    print (closing_prices)
    count = count + 6

エラーが発生する理由は、リストの最後の項目の 5 番目から 6 を追加すると、いわばリストの最大インデックスの範囲外になるためです。

もう 1 つの考えられる解決策は、while ループを使用することです。

closing_prices = []
count = 10

while count < len(stock_data):
    closing_prices.append(stock_data[count])
    count += 6

print closing_prices
于 2013-06-29T23:31:58.143 に答える
1

実際には、1 行のコードで記述できます。

あなたのデータ:

stock_data = [
    'Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close\n2013-06-28',
    '874.90', '881.84', '874.19', '880.37', '2349300', '880.37\n2013-06-27',
    '878.80', '884.69', '876.65', '877.07', '1926500', '877.07\n2013-06-26',
    '873.75', '878.00', '870.57', '873.65', '1831400', '873.65\n2013-06-25',
    '877.26', '879.68', '864.51', '866.20', '2553200', '866.20\n2013-06-24',
    '871.88', '876.32', '863.25', '869.79', '3016900', '869.79\n2013-06-21',
    '888.34', '889.88', '873.07', '880.93', '3982300', '880.93\n2013-06-20',
    '893.99', '901.00', '883.31', '884.74', '3372000', '884.74\n'
]

あなたのコード:

print [stock_data[i] for i in xrange(10, len(stock_data) - 1, 6)]

あなたの出力:

['880.37', '877.07', '873.65', '866.20', '869.79', '880.93', '884.74']
于 2013-06-29T23:32:13.933 に答える