2017-03-18 1 views
2

私の状況: 私は、互いに対応すると思われる2つのリストをNetLogoに持っています。マトリックスの2つの行である。 1は、これらの対が破壊されないことが8と7と13、2と対にすると考えられ、そして2。例えばNetLogo:対応するリストを参照する基準を使用してリストをフィルタリングする方法は?

set list-1 [1 2 2] 
set list-2 [13 7 8] 

私の問題:

私はリスト1の対応する要素に基準を適用することによって、リスト2をフィルタリングします。例えば。

リスト2:1対応が等しい2

ないため13が除去され [7 8]

対応する項目が2

結果があるべき等しい場合、リスト2の項目を保存します

これをNetLogoでどのようにプログラムするのですか?

マイNetLogoバージョン: 5.3.1

答えて

3

私はこれを行うにはさまざまな方法を考えることができます:

to go 
    let list-1 [1 2 2] 
    let list-2 [13 7 8] 

    ; the most straightforward, imperative way: 
    let list-3 [] 
    (foreach list-1 list-2 [ 
    if ?1 = 2 [ set list-3 lput ?2 list-3 ] 
    ]) 
    print list-3 

    ; an uglier imperative version using indices: 
    let list-4 [] 
    let i 0 
    while [ i < length list-1 ] [ 
    if item i list-1 = 2 [ set list-4 lput item i list-2 list-4 ] 
    set i i + 1 
    ] 
    print list-4 

    ; using reduce, sentence and map: 
    print reduce sentence (map [ 
    ifelse-value (?1 = 2) [ ?2 ] [ [] ] 
    ] list-1 list-2) 

    ; using map, filter, and indices: 
    print map [ item ? list-2 ] filter [ 
    item ? list-1 = 2 
    ] n-values length list-1 [ ? ]  

    ; another variant using `filter`: 
    print map last filter [ first ? = 2 ] (map list list-1 list-2) 

end 

私はそれが表現だと思うと、最後の一つは、はるかに私のお気に入りであること他のものよりも優れていると思っていますが、それは主観的かもしれません。

は、あなたがレポーターにお好みの方法を隔離することができ、再利用可能なものを作るには:

to-report filtered-by-first-list [ filtering-task list-1 list-2 ] 
    report map last filter [ 
    (runresult filtering-task first ?) 
    ] (map list list-1 list-2) 
end 

をそして、あなたはこのようにそれを呼び出すことができます。NetLogo 6構文にこのすべてを変換する

observer> show filtered-by-first-list task [ ? = 2 ] [1 2 2] [13 7 8] 
observer: [7 8] 

読者には練習として残されています。 :-)

関連する問題