NetLogo: Как сравнить два подсписка - PullRequest
0 голосов
/ 18 мая 2018

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

Предположим, у меня есть список из трех списков

Let mylist [ [ 1 2 3 4 5 ] [ 2 2 2 2 2 ] [ 3 3 3 3 3 ] ]

Я хотел бы проверить каждый элемент в пределах item 2 mylist (т.е. [3 3 3 3 3]) и посмотрите, не равен ли он соответствующему элементу в item 0 mylist (т.е. [1 2 3 4 5]).В этом случае я бы хотел вычесть постоянное значение, равное 5, из этого элемента в item 2 mylist.

Другими словами, я бы хотел, чтобы мой список был изменен на следующее:

[ [ 1 2 3 4 5 ] [ 2 2 2 2 2 ] [ -2 -2 3 -2 -2 ] ]

Заранее спасибо,

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Ваш собственный ответ в порядке, но вот то, что я считаю более элегантным способом сделать это:

print lput (map [ [ a b ] ->
  ifelse-value (a = b) [ b ] [ b - 5 ]
] (item 0 mylist) (item 2 mylist)) but-last mylist

Ключевой примитив здесь - map,что означает foreach, что of означает ask: вместо выполнения команды для каждого элемента, он запускает репортер и строит новый список из результатов.В данном конкретном случае это избавляет вас от необходимости возиться с индексами и replace-item внутри.

Комбинация lput и but-last позволяет легко заменить последний подсписок в вашем основном списке, ноВы также можете использовать replace-item для этого.Или, в зависимости от того, для чего он вам нужен, вы можете просто использовать результат map напрямую, а не возвращать его в свой основной список.

0 голосов
/ 18 мая 2018

Мне удалось решить проблему, разделив подсписки:

to go
Let mylist [ [ 1 2 3 4 5 ] [ 2 2 2 2 2 ] [ 3 3 3 3 3 ] ]
let auxiliar-list1 item 0 mylist
let auxiliar-list2 item 2 mylist
foreach ( range 0 ( length auxiliar-list1 ) ) [ num-item ->
    if item num-item auxiliar-list1 != item num-item auxiliar-list2 [
      set auxiliar-list2 replace-item num-item auxiliar-list2 (item num-item auxiliar-list2 - 5)
      show mylist
      show auxiliar-list1
      show auxiliar-list2
    ]
 ]  
end
...