好的,所以我正在开发一个模拟森林生长的模型。增长由复杂的功能定义,该功能基于多年来森林的年龄。森林每隔r
年定期砍伐一次,并在第1年重新开始生长(假设砍伐是瞬间的)。该模型从r
年(一个常设森林)开始
如果r = 50
和建模时间范围的限制(limit
)=500
,则以下代码将返回从1到r的值列表,其循环直到超出限制,然后被截断以删除limit
r = 50
limit = 500
x = list(range(1,r+1)) #produces a list from 1-r
x = x*(int(limit/r)+1) #multiples the list to be bigger than limit (to capture values of r which don't divide into it evenly (no floats allowed)
x2 = [r] #adds the first value of the list (r)
x2 = x2+x #adds the multiplied list to X2
x2 = x2[0:limit] #truncates the list to (limit)
这段代码有效,但它似乎是一种不必要的繁琐办法。任何人都可以提出更优雅的解决方案吗?
答案 0 :(得分:1)
使用itertools.cycle
优雅复制此类循环重复:
from itertools import cycle, islice
x = cycle(range(1,r+1))
next(islice(x, r-1, r-1), None) # advance cycle object to 50 for first entry
x2 = list(islice(x, 0, limit)) # slice up to desired limit
您可以跳过进度部分并将其计入最终切片步骤,因此切片从r-1
开始,到limit+r-1
结束:
from itertools import cycle, islice
x = cycle(range(1,r+1))
x2 = list(islice(x, r-1, limit+r-1))
答案 1 :(得分:0)
您可以使用以下代码:
r =50
limit = 500
x2 = [50]
for i in range(int(limit/r)):
x2 = x2 + list(range(1,r+1))
del x2[-1]