我有一份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]
这是我的尝试:
def continue_list(x):
l = []
m = []
for i in x:
if math.floor(i) == 1:
l = l+ x[x.index(i):]
l = list(map(lambda x: x+365, l))
m = m + x[:x.index(i)]
new_x = m + l
return new_x
这适用于小型列表。但对于包含900,000个条目的列表,这是不可行的;我的电脑立刻崩溃了。有关更快方法的任何提示吗?
答案 0 :(得分:1)
如果您正在从文件中读取数据,那么您应该尝试一次操作文件的较小部分。在处理数据时,将输出附加到outfile。例如,读取文件的前1000行。处理它们然后将它们写入outfile。然后继续下一行1000行。这样,python不需要将所有900k行保留在内存中。先前处理过的行将被垃圾收集。
答案 1 :(得分: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则会怎么样?那将是未被发现的,我实际上并不知道如何检测到这一点。您的数据是否包含更多详细信息?那么闰年呢?