Я использую этот пост (как сделать заменяющий элемент использовать вложенный список) в качестве руководства для разработки способов замены элементов в списке, соответствующих заданным критериям.

В частности, я хочу заменить все нули в списке со значением = 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]

Любая помощь приветствуется! Благодарность

3
skivvy 25 Май 2017 в 00:41

2 ответа

Лучший ответ

Каждый раз, когда вы используете report, он выходит из процедуры и сообщает результат в этот момент. Быстрое исправление с использованием вашего кода заключается в изменении строки report в вашем операторе if, чтобы она заменяла элемент с текущим индексом:

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]
2
Luke C 24 Май 2017 в 22:07

Эту задачу легче выполнить с map, чем foreach.

Синтаксис 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
3
Seth Tisue 30 Май 2017 в 13:29