0

我有两个数组

id_array   :{2 1 1 2 3 1 2}
type_array :{apple apple orange orange pineapple pineapple pineapple}

我想处理上述数组,并根据我想要分组的 ids 和类型如下:

苹果 2 苹果 1 橙子 1 2 菠萝 3 菠萝 1 2

4

2 回答 2

0

欢迎来到堆栈溢出。通常,我们喜欢看到用户尝试解决他们自己的问题,因为它有助于将注意力集中在未来访问者可能会发现有用的特定歧义或误解上。但是,我们通常也愿意提供帮助,无论:

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}}
于 2013-01-09T17:35:56.853 回答
0

这与 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 个元素的列表,其中包含列表 {2 apple},
  • 一个包含 1 个元素的列表,其中包含列表 {1 apple},
  • 一个包含 2 个元素的列表,其中包含列表 {1 orange} 和列表 {2 orange},
  • 一个包含 1 个元素的列表,其中包含列表 {3 pineapple},以及
  • 一个包含 2 个元素的列表,其中包含列表 {1 pineapple} 和列表 {2 pineapple}。

使用此最终列表进行报告的一种方法是:

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
于 2013-01-09T18:00:02.213 回答