2016-03-09 4 views
3

Я пытаюсь ввести значение в список списков, когда это необходимо.NetLogo - добавьте единственное значение в список списков

Я определяю список глобально:

set mylist [[[][]][[][]]] 

На различных этапах моделирования, я хотел бы иметь агент вставить значение в список (эти значения будут составлять свои собственные списки). Например, если я хотел бы добавить значение 2 к пункту 0 пункта 1, я бы поставил:

.... 
set item 0 item 1 mylist lput 2 item 0 item 1 mylist 
.... 

Который возвращает сообщение об ошибке «Это не то, что вы можете использовать„установить“на». Любая помощь? У меня, похоже, есть фундаментальное недоразумение о добавлении в списки.

FYI мой inteded возвращение в приведенном выше примере будет для MyList стать:

[[[][]][[2][]]] 

(А другой агент будет иметь возможность добавить еще одно значение для пункта 0 пункта 1 позже в моделировании, если требуется).

Благодаря

+0

Вам нужно «replace-item». Обратите внимание, что 'replace-item' возвращает новый список; Списки NetLogo являются неизменяемыми, поэтому вам нужно «установить mylist replace-item ...» –

+0

, возможно, полезно: http://stackoverflow.com/q/23182872/86485, http://stackoverflow.com/q/21354589/86485 –

+0

Спасибо за ответ. Это охватывает замену элемента в списке, но можно ли добавить элемент в список (с lput), а не заменять его вообще? Здесь я все еще застрял. – Stephen

ответ

2

NetLogo списки неизменны, а это означает, что вы никогда не можете реально изменить существующий список, только сделать новую. Если вы хотите изменить mylist, вам нужно set mylist ..., где ... - это новый список, который вы только что создали.

Чтобы создать новый список на основе старого списка, за исключением замены в другом значении в одном месте, ну, вот что такое replace-item.

Но replace-item не знает о вложенности, поэтому мы должны справиться с этим сами, дважды позвонив replace-item, один раз для внутреннего списка и один раз для внешнего списка.

Предполагаю, что ваш список имеет фиксированную глубину вложенности 2, и вам не нужно обрабатывать произвольные глубины гнездования.

Первый строительный блок нам нужно, мы можем скопировать дословно из https://stackoverflow.com/a/23256444/86485:

to-report replace-subitem [index1 index2 lists value] 
    let old-sublist item index1 lists 
    report replace-item index1 lists (replace-item index2 old-sublist value) 
end 

Теперь для того, чтобы решить вашу проблему, мы только нужно сделать немного больше работы:

to-report lput-subitem [index1 index2 lists value] 
    report replace-subitem index1 index2 lists 
      lput value (item index2 item index1 lists) 
end 

Давайте возьмите его для вращения:

observer> set mylist [[[][]][[][]]] 
observer> print mylist 
[[[] []] [[] []]] 
observer> set mylist lput-subitem 1 0 mylist 2 
observer> set mylist lput-subitem 1 0 mylist 3 
observer> print mylist 
[[[] []] [[2 3] []]] 

Это работает!