我有两个阵列数组操作,并将它们组
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