私は2つの配列を持っています
id_array :{2 1 1 2 3 1 2}
type_array :{apple apple orange orange pineapple pineapple pineapple}
上記の配列を処理し、ID とタイプに基づいて、次のようにグループ化したい:
りんご 2 りんご 1 オレンジ 1 2 パイナップル 3 パイナップル 1 2
私は2つの配列を持っています
id_array :{2 1 1 2 3 1 2}
type_array :{apple apple orange orange pineapple pineapple pineapple}
上記の配列を処理し、ID とタイプに基づいて、次のようにグループ化したい:
りんご 2 りんご 1 オレンジ 1 2 パイナップル 3 パイナップル 1 2
スタック オーバーフローへようこそ。通常、ユーザーが自分の問題を解決しようとする試みを見るのが好きです。これは、将来の訪問者が役立つかもしれない特定のあいまいさや誤解に焦点を当てるのに役立つからです。ただし、通常は次のような場合でも喜んでお手伝いします。
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の回答と非常に似ていますが、辞書データ構造を使用します
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
はリストのリストです。各要素 (または「サブリスト」) は一貫した構造を維持します。私たちは見る:
この最終リストを報告する 1 つの方法は次のとおりです。
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