List 按Netlogo中的元素对列表进行分组

List 按Netlogo中的元素对列表进行分组,list,foreach,netlogo,List,Foreach,Netlogo,假设我在Netlogo中有一个模型,现在我有兴趣开发一个reporter/程序,根据第一个元素分组列出。 举个例子,让我们假设 globals[list1 list2 list3 listoflists ordered-list-a ordered-list-b ] to setup set list1 ["a" "b" "c"] set list2 ["a" "c" "d"] set list3 ["b" "a" "c"] set listoflists (list li

假设我在Netlogo中有一个模型,现在我有兴趣开发一个reporter/程序,根据第一个元素分组列出。 举个例子,让我们假设

globals[list1 list2 list3 listoflists
ordered-list-a
  ordered-list-b
]

to setup
  set list1 ["a" "b" "c"]
  set list2 ["a" "c" "d"]
  set list3 ["b" "a" "c"]
  set listoflists (list list1 list2 list3)
end
我想创建一个列表列表,这样在每个列表中都有以相同元素开头的列表。因此,期望的输出是

[[["a" "b" "c"]["a" "c" "d"]]["b" "a" "c"]]]
i、 e,其中第一个元素聚合了所有列表,第一个元素是a,第二个元素聚合了所有以“b”开头的列表

理想情况下,这应该可以为大量用户扩展。我试过了

to create-list
  set ordered-list-a []
  set ordered-list-b []
   (foreach listoflists [[i] ->
    if item 0 i = "a" [set ordered-list-a lput i ordered-list-a]
  if item 0 i = "b" [set ordered-list-b lput i ordered-list-b]
  ])  
end
然后从a和b中创建一个列表,这很有技巧,但是a)它非常混乱,b)需要我事先知道列表的长度,而在实际情况中我不知道(这是一个海龟过程),c)这看起来像是很多不必要的编码

是否有某种方法可以将上述过程扩展到任意数量的起始元素(可能在一个while周期内?),并且不需要为每个初始列表元素创建列表


非常感谢

我假设所需的输出应该是:
[[[“a”“b”“c”][“a”“c”“d”][[“b”“a”“c”]]]
。我相信你在第二组之前错过了一个
[

无论如何,一个简单但有点低效的方法是:

; items is a list of items to be grouped
; key is an anonymous reporter that extracts the group label from a single item
to-report group-by [ items key ]
  let keys remove-duplicates map key items
  report map [ k -> filter [ x -> (runresult key x) = k ] items ] keys
end
请注意,以上是一个完全通用的分组函数。要在您的案例中使用它,您需要执行以下操作:

group-by listoflists [ l -> first l ]
一个更有效的方法是使用


太好了!非常感谢,Bryan。将使用表扩展来最小化代码(需要对几种代理类型执行此操作…)就像一个符咒一样工作!:-)是的,确实我缺少了一个方括号,很好地发现了。
table:group-items listoflists [ l -> first l ]