2017-11-01 6 views
3

わかりましたので、私は森林の成長をシミュレートするモデルに取り組んでいます。成長は複雑な関数で定義され、これは長年の森林の年齢に基づいています。森林は毎年r年ごとに定期的に削減され、1年目に森林回復が再開されます(伐採は瞬間的であると想定されます)。それは限界を超えるまで以下のコードは1からのサイクルRに値のリストが返されr = 50場合にモデル化された時間スケールの限界(limit=500モデルは、年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

私はこのコードがあなたの考えをしているとは思わない?ランニングの終わりに、あなたは500のintsのリストを持っています - 私は50の木があるという質問から考えたでしょうか?私はあなたの質問を誤解しましたか? – srattigan

+0

はい、リストは時間の経過とともに木の年齢を与えます(1から50の間)ので、年齢に基づいて森林の量を計算するために使用できます。年齢に基づいてグラフを絶対軸で使用できます年齢はx(1〜500)です。これは理にかなっていますか? – Will

+1

お詫び申し上げますが、私はあなたがリストを反復し、各要素の値を変更したいと考えていると解釈しました。だからあなたは[50、1、... 50、1、..... 50、1、... 50など]を望んでいますか?これが欲しい場合は、コードを数行簡略化することができますが、読みにくくなる可能性はありますが、それほど効率的ではありませんか?可読性は良いです。 – srattigan

答えて

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)) 
0

次のコードを使用できます。

r =50 
limit = 500 
x2 = [50] 
for i in range(int(limit/r)): 
    x2 = x2 + list(range(1,r+1)) 

del x2[-1] 
+1

非常に非効率的な 'limit/r'リストのコンテンションです。 –

+0

は手に入りませんでしたか?あなたは精緻化できますか? rとlimitは単なる整数です。 – gB08

+0

私は、python 3のように(limit/r)の値を計算することと関連していると思います。範囲関数はイテレータを使います。イテレーターを使用しているときは、forステートメントのすべてのループがその次の数値を生成するので、計算は何度も実行されます。これは、Python 2.xの範囲関数とは異なります。 – srattigan

関連する問題