我有兩個陣列數組操作,並將它們組
id_array :{2 1 1 2 3 1 2}
type_array :{apple apple orange orange pineapple pineapple pineapple}
我要處理的上述陣列和基於我想組以下的ID和類型,如下所示:
蘋果2 apple 1 orange 1 2 菠蘿3 菠蘿1 2
我有兩個陣列數組操作,並將它們組
id_array :{2 1 1 2 3 1 2}
type_array :{apple apple orange orange pineapple pineapple pineapple}
我要處理的上述陣列和基於我想組以下的ID和類型,如下所示:
蘋果2 apple 1 orange 1 2 菠蘿3 菠蘿1 2
這是非常平行於acheong87的答案,但我會用一本字典的數據結構
set types {apple apple orange orange pineapple pineapple pineapple}
set ids {2 1 1 2 3 1 2}
set groups [dict create]
foreach id $ids type $types {
dict lappend groups $type [list $id $type]
}
puts $groups
# apple {{2 apple} {1 apple}} orange {{1 orange} {2 orange}} pineapple {{3 pineapple} {1 pineapple} {2 pineapple}}
set out [list]
dict for {type sublist} $groups {lappend out $sublist}
puts out
# {{2 apple} {1 apple}} {{1 orange} {2 orange}} {{3 pineapple} {1 pineapple} {2 pineapple}}
更新因要求說明:
set ids {2 1 1 2 3 1 2}
set types {apple apple orange orange pineapple pineapple pineapple}
set groups [list]
set current_type ""
set prev_id -1
foreach id $ids type $types {
if {$type ne $current_type || $id < $prev_id} {
if {[info exists group]} {lappend groups $group}
set group [list]
set current_type $type
}
lappend group [list $id $type]
set prev_id $id
}
lappend groups $group
puts [list $groups]
相比,你問的這個輸出
{{{2 apple}} {{1 apple}} {{1 orange} {2 orange}} {{3 pineapple}} {{1 pineapple} {2 pineapple}}}
注意額外的支撐。最終列表$groups
是列表的列表。每個元素(或「子列表」)保持一致的結構。我們看到:
一種方法是:
foreach sublist $groups {
foreach pair $sublist {
lassign $pair id type
puts "$id -> $type"
}
}
印刷
2 -> apple
1 -> apple
1 -> orange
2 -> orange
3 -> pineapple
1 -> pineapple
2 -> pineapple
回答最後一個請求:給定上述最終名單:
set answer [list]
foreach sublist $groups {
lappend answer [lindex $sublist 0 1]
foreach pair $sublist {lappend answer [lindex $pair 0]}
}
puts [join $answer]
打印
apple 2 apple 1 orange 1 2 pineapple 3 pineapple 1 2
我在尋找以下最終輸出{{2,apple},{1,apple},{{1,orange},{2,orange}},{3,pineapple},{{ 1,pineapple},{2,pineapple}}在你的回答中無法得到答案 – user1863934
不,因爲你沒有解釋如何創建組,直到我問。答案已更新。 –
我不懂字典數據結構。我正在查看最終輸出結果{{2,apple},{1,apple},{{1,orange},{2,orange}},{3,pineapple},{{1,pineapple},{2,pineapple }}我怎麼能得到那個 – user1863934
歡迎來到Stack Overflow。通常,我們喜歡看到用戶嘗試解決他們自己的問題,因爲它有助於將注意力集中到特定的含糊或誤解,未來的訪問者可能會發現有用。然而,我們通常也願意提供幫助,無論如何:
Tcl有一個有趣的形式foreach
,它允許我們同時迭代多個列表。
set id_array [list 2 1 1 2 3 1 2]
set type_array [list apple apple orange orange pineapple pineapple pineapple]
foreach id $id_array type $type_array {
lappend hash($type) [list $id $type]
}
foreach name [array names hash] {
lappend output $hash($name)
}
puts $output
這種輸出,對我來說,
{{1 orange} {2 orange}} {{3 pineapple} {1 pineapple} {2 pineapple}} {{2 apple} {1 apple}}
謝謝acheong87。我想保持與原始問題中提到的相同的順序。我如何顯示輸出 – user1863934
請注意,Tcl使用不同的術語:數字索引數組稱爲「**列表**」;一個任意的字符串索引數組,一個哈希映射,被稱爲「**數組**」。 –
我看到你問了同樣的問題措辭不同(http://stackoverflow.com/q/14241911/7552) - 請解釋算法來分組項目。爲什麼桔子是分組的,但蘋果不是? –
桔子被分組,因爲它們按照升序排列,因爲它們按降序排列,所以不分組。也適用於菠蘿{3。菠蘿}沒有分組,但是最後一部分{{1,菠蘿},{2,菠蘿}}被分組。我希望我回答你的問題。 – user1863934