2014-08-28 2 views
2

У меня есть список пар точек (в координатах NetLogo) называется «Coords», который выглядит следующим образом:Комбинирование и форматирование списков в NetLogo

[[[255 97] [256 97]] 
[[-131 408] [-129 407]] 
[[-125 406] [-122 405]] 
[[-84 188]] [-83 188]] 
[[-303 200] [-304 203]] 
[[25 414] [19 415]] 
[[-128 256] [-125 254]] 
.......................................] 

Каждая точка пара связана с ней переменной классификации, который принимает одно из значений «I», «U» или «S». У меня есть отдельный список этих классификационных переменных, называемый «coord_class» той же длины и в том же порядке, что и пары точек, перечисленные выше.

["S" "S" "U" "I" "S" "I" "U" ...] 

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

[[[255 97 "S"] [256 97 "S"]] 
[[-131 408 "S"] [-129 407 "S"]] 
[[-125 406 "U"] [-122 405 "U"]] 
[[-84 188 "I"]] [-83 188 "I"]] 
[[-303 200 "S"] [-304 203 "S"]] 
[[25 414 "I"] [19 415 "I"]] 
[[-128 256 "U"] [-125 254"U"]] 
.......................................] 

Обратите внимание, что обе точки в данной паре взять то же самое значение переменной классификации.

Я попытался сделать это с помощью карты репортер:

set coords (map [list ?1 ?2] coords coord_class) 

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

[[[[255 97] [256 97]] "S"] 
[[[-131 408] [-129 407]] "S"] 
[[[-125 406] [-122 405]] "U"] 
[[[-84 188]] [-83 188]] "I"] 
[[[-303 200] [-304 203]] "S"] 
[[[25 414] [19 415]] "I"] 
[[[-128 256] [-125 254]] "U"] 
.......................................] 

Это не структурированный должным образом для выполнения других функций в код. Любые советы, которые помогут мне получить желаемый результат, будут оценены. Благодаря!

ответ

2

У вас есть список списков списков. Для выполнения необходимых действий потребуются две отдельные операции map. Самый простой способ сделать это, вероятно, разделить задачу между двумя небольшими репортерами:

to-report add-classes [ coords classes ] 
    report (map add-class coords classes) 
end 

to-report add-class [ lists class ] 
    report map [ lput class ? ] lists 
end 

Вы можете использовать его как это:

to go 
    let coords [ 
    [ [ 255 97] [ 256 97] ] 
    [ [-131 408] [-129 407] ] 
    [ [-125 406] [-122 405] ] 
    [ [ -84 188] [ -83 188] ] 
    [ [-303 200] [-304 203] ] 
    [ [ 25 414] [ 19 415] ] 
    [ [-128 256] [-125 254] ] 
    ] 
    let coord_class ["S" "S" "U" "I" "S" "I" "U"] 
    show add-classes coords coord_class 
end 

Какой будет печатать нужный вывод:

[[[255 97 "S"] [256 97 "S"]] [[-131 408 "S"] [-129 407 "S"]] [[-125 406 "U"] [-122 405 "U"]] [[-84 188 "I"] [-83 188 "I"]] [[-303 200 "S"] [-304 203 "S"]] [[25 414 "I"] [19 415 "I"]] [[-128 256 "U"] [-125 254 "U"]]] 
+1

Отлично, это сработало отлично. Гипотетически говоря, если бы я хотел конкатенировать другой набор атрибутов, я бы просто вложил второй блок кода. Например: установить комбинированные классы add-classes coords coord_class набор супер-комбинированных классов add-classes комбинированных классов new-field – JP081X

+0

Это работает, да. Но на самом деле это довольно хороший вариант использования для '' reduce'' (http://ccl.northwestern.edu/netlogo/docs/dictionary.html#reduce). Попробуйте: show show add-classes (list coords coord_class new-field) '. (И вы можете добавить столько полей, сколько хотите в список.) –