2017-05-24 2 views
2

私はこのリスト(how to do replacing-item in use nested list)をリストとして使用して、指定された条件を満たすアイテムを置き換える方法を解説しました。リスト内の特定の条件を満たすすべてのアイテムを交換する方法

具体的には、リスト内のすべての0を値= 0.5に置き換えたいとします。しかし、私が思いついたコードは、リストの最初のゼロを置き換えているように見えます。私はその理由を理解できません。

これは私のコードです:

to-report A-new-list-without-zeros [old new the-list] 
let A-index-list n-values length the-list [?] 
(foreach A-index-list the-list 
    [ if ?2 = old 
     [ report replace-item ?1 the-list new ] 
    ]) 
report the-list 
end 

そして、これは何が起こるかです:

observer> show A-new-list-without-zeros 0 0.5 [0 1 0 5 5 0] 
observer: [0.5 1 0 5 5 0] 

すべてのヘルプははるかに高く評価されるだろう!ありがとう

答えて

1

いつでもreportを使用すると、プロシージャを終了し、その時点で出力を報告します。

to-report A-new-list-without-zeros [old new the-list] 
let A-index-list n-values length the-list [?] 
(foreach A-index-list the-list 
    [ if ?2 = old 
     [ set the-list replace-item ? the-list new ] 
    ]) 
report the-list 
end 

observer> print A-new-list-without-zeros 0 0.5 [ 0 1 0 5 5 0 ] 
[0.5 1 0.5 5 5 0.5] 
+0

本当にありがとうございました@Luke C!それは完璧に動作します!ちょっと不思議なことに、私がガイドとして使ったポストで、なぜネストされた 'report'コマンドがうまくいったのですか?これは、その例が最初の項目にのみ焦点を当てたか、またはネストされたリストを扱ったからですか? – skivvy

+0

心配はいりません!あなたの@ Seth Tisueの答えの2番目の部分についてあなたが話しているなら、彼は記者の中に記者を入れていることに気付くでしょう。その場合、彼の 'report-first'は、最初のアイテムの交換なしに**を置き換えてリストを報告するか、それとも続かないでしょう。 'report'が呼び出されると、そのプロシージャが実行されます。トリックは 'replace-first'が' replace-firsts'の中にネストされているので、 'replace-firsts'は傘リストを反復し、' replace-first'を使ってサブリストを評価していました。それは理にかなっていますか? –

+0

ああ、私は今それを得ると思います。説明してもう一度私を助けてくれてありがとう! :) – skivvy

2

このタスクをより容易にforeachよりmapで達成される:あなたのコードを使用してクイックフィックスは、それが現在のインデックスにある項目を置き換えるように、あなたのif文でreport行を変更することです。

NetLogo 6構文:

to-report A-new-list-without-zeros [old new the-list] 
    report map [[x] -> ifelse-value (x = old) [new] [x]] the-list 
end 

NetLogo 5構文:

to-report A-new-list-without-zeros [old new the-list] 
    report map [ifelse-value (? = old) [new] [?]] the-list 
end 
+0

ああ!私は 'ifelse-value'を使ったことはないと思いますが、これは素晴らしいことです。ありがとう@SethTisue! – skivvy

関連する問題