简化重复整数集的列表生成

时间:2017-11-01 13:02:03

标签: python python-3.x list optimization

好的,所以我正在开发一个模拟森林生长的模型。增长由复杂的功能定义,该功能基于多年来森林的年龄。森林每隔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)

这段代码有效,但它似乎是一种不必要的繁琐办法。任何人都可以提出更优雅的解决方案吗?

2 个答案:

答案 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]