Фильтрация во всех списках с использованием двух параметров - PullRequest
1 голос
/ 20 января 2020

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

show sum map [t -> length filter [a -> item 1 a = turtle 3] [ all-archives ]] of all-turtles 

Приведенный выше код должен подсчитать, сколько раз item 1, созданное turtle 3, включено в списки (all-archives) всех черепах (all-turtles). Однако из приведенной выше формулы я получил следующую ошибку:

ОШИБКА: ожидается закрывающая скобка

(во втором «а»).

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

1 Ответ

1 голос
/ 21 января 2020

У вас есть неуместный ]. Иногда эти длинные команды легче разбить на части. Следующий код устанавливает тест, когда две черепахи помещают две записи в определенное количество других архивов черепах, а также в свои собственные. Затем он выполняет подсчет по частям и, наконец, объединяет эти части в одну команду. В вашем вопросе вы используете «все-черепах», но это просто turtles в NetLo go. Последняя команда смотрит только на случайное подмножество черепах.

turtles-own [ archive ]

to test
  clear-all
  create-turtles 100 [
    set archive []
  ]

  ask turtle 3 [
    let archive-entry list "at home" self
    set archive fput archive-entry archive
    ask n-of 30 other turtles [ set archive fput archive-entry archive ]
    set archive-entry list "not at home" self
    set archive fput archive-entry archive
    ask n-of 40 other turtles [ set archive fput archive-entry archive ]
  ]

   ask turtle 4 [
    let archive-entry list "at home" self
    set archive fput archive-entry archive
    ask n-of 20 other turtles [ set archive fput archive-entry archive ]
    set archive-entry list "not at home" self
    set archive fput archive-entry archive
    ask n-of 50 other turtles [ set archive fput archive-entry archive ]
  ] 
  ; get a list of all archives.
  let list-of-all-archives [archive] of turtles
  ; make a list of the number of occurrences we are looking for in each archive.
  let list-of-count-in-each-archive map [t -> length filter [a -> item 0 a = "at home" and item 1 a = turtle 3] t] list-of-all-archives
  ; sum up the number of occurences across all archives.
  show sum list-of-count-in-each-archive

  show sum map [t -> length filter [a -> item 0 a = "not at home" and item 1 a = turtle 3] t] [archive] of turtles
  show sum map [t -> length filter [a -> item 0 a = "at home" and item 1 a = turtle 4] t] [archive] of turtles
  show sum map [t -> length filter [a -> item 0 a = "not at home" and item 1 a = turtle 4] t] [archive] of turtles

  show sum map [t -> length filter [a -> item 0 a = "not at home" and item 1 a = turtle 4] t] [archive] of n-of 50 turtles
end

Я надеюсь, что это помогает прояснить ситуацию,

Чарльз

...