2017-02-27 5 views
2

私はDOYデータのリストを持っています。このリストは、ほぼ900,000のエントリーである。大きなリストを分割する最速の方法

>>> continue_list([140, 141, 145, 270, 365, 365.90, 1, 2, 5, 360]) 
>>> [140, 141, 145, 270, 365, 365.90, 366, 367, 370, 725] 

は、ここに私の試みです:

私がいる問題は、私はそれは例えば、過去365を行ってみたいときに、データは、最初は365まで上昇したが、その後、再び1から始まるということです​​

これは小さなリストでも機能します。しかし、900,000件のエントリを持つリストの場合、それは実現可能ではありません。すぐにコンピュータがクラッシュします。より速いアプローチのヒント

+0

"スプリット"がどこに来るのか、あなたの期待する出力を得る方法がわかりません。何年に1回のサイクルを経なければならないのでしょうか?それらの値に加算する総日数はどのように考慮しますか? 1年を完全に逃してしまうとどうなりますか? – roganjosh

+0

365は一定のオフセットですか、あるいは変更できますか?あなたの例とコード –

答えて

1

私は発電機をお勧めします:

l = [140, 141, 145, 270, 365, 365.90, 1, 2, 5, 360, 1] 

def wrap_at_365(it): 
    # The number of wraps that have been found. 
    wraps = 0 
    it = iter(it) 
    # Get the first item 
    last = next(it) 
    yield last 
    for item in it: 
     # Identify a wrap by checking if the next item is smaller than the previous 
     if item < last: 
      wraps += 1 
     yield item + 365 * wraps 
     last = item 

それはすぐlistにキャストすることができます。

>>> list(wrap_at_365(l)) 
[140, 141, 145, 270, 365, 365.9, 366, 367, 370, 725, 731] 

私のコンピュータ上で、それは100万個の数字を含むリストを変換するために、およそ0.5秒かかります。


しかし、注意する必要がある回数を特定するには。私は最後の項目が現在の項目よりも大きいことを確認しましたが、それが1年で100で、次の項目が2年で110であればどうなりますか?それは検出されず、私は実際にそれを検出する方法を知らない。あなたのデータには詳細がいくつか含まれていますか?そしてうるう年はどうですか?

+0

から私のすべてのデータはおおよそ同じ形式になっていることは明らかではありません。 1年目のおよそ140日目に始まり、2年目の365日目の直前に終わります。あなたが提供した機能が完璧に働いた、あなたに助けてくれてありがとう! –

1

ファイルからデータを読み取っている場合は、一度にファイルの小さなセクションで操作してみる必要があります。データを処理しているときに、出力を出力ファイルに追加します。たとえば、ファイルの最初の1000行を読み込みます。それらを処理し、outfileに書き出します。その後、次の1000行に進みます。この方法では、Pythonはすべての900k行をメモリに保持する必要はありません。以前に処理された行はガベージコレクションされます。

関連する問題