2017-02-27 97 views
2

我有一个DOY数据列表。该名单长达近900,000个条目。我遇到的问题是,该数据最初上升到365,但随后在1重新开始,我想它晃过365例如:拆分大型列表的最快方法

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

这里是我的尝试:

​​

这适用于完美的小列表。但是对于有900,000个条目的列表来说,这是不可行的;我的电脑立即崩溃。任何提示更快的方法?

+0

我不清楚“分裂”在哪里或如何得到您的预期输出;如果你经历几个年度周期,会发生什么情况,你如何计算添加到这些值的总天数?如果一年完全错过,会发生什么? – 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] 

在我的电脑大约需要0.5秒转换含有1万个号码的清单。


但是要确定你需要小心的次数。我检查了最后一个项目是否比当前项目大,但是如果第一年是100,下一个项目是第二年110?这将不被发现,我实际上不知道如何检测。你的数据是否包含更多细节?那么闰年呢?

+0

中不清楚我的所有数据大致以相同的形式出现。大约在第一年的第140天开始,并在第二年的第365天之前结束。你赋予的功能非常完美,谢谢你的帮助! –

1

如果您正在读取文件中的数据,那么您应该尝试一次对文件的较小部分进行操作。在处理数据时,将输出追加到outfile。例如,读取文件的前1000行。处理它们,然后将它们写入outfile。然后继续下一行1000行。这样,python不需要在内存中保留所有的900k行。先前处理过的行将被垃圾收集。