tcl从子列表中制作单个列表

时间:2016-01-12 15:03:59

标签: arrays list tcl

将列表列表转换为单个列表。例如:

List1 {1 2 {3 4 5} 6 7 {8} 9 10 {{11 12} 13} 14 {15} 16 {{{{17} 18} 19} 20} 21 22 {23} 24 25 }
转换为
清单1 {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25}

如何转换?

2 个答案:

答案 0 :(得分:1)

使用tcllib:

package require struct::list
set List1 {1 2 {3 4 5} 6 7 {8} 9 10 {{11 12} 13} 14 {15} 16 {{{{17} 18} 19} 20} 21 22 {23} 24 25}
puts [struct::list flatten -full $List1]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Documentation

答案 1 :(得分:0)

如果叶子是简单的单词(例如,字母,数字,句号,但绝对没有 Tcl元字符),join就相当简单:

set s {1 2 {3 4 5} 6 7 {8} 9 10 {{11 12} 13} 14 {15} 16 {{{{17} 18} 19} 20} 21 22 {23} 24 25}
while {[set t [join $s]] ne $s} {set s $t}
puts $s
# => 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

要了解其工作原理,请尝试在循环中放置puts,就像在此交互式会话中一样:

% while {[set t [join $s]] ne $s} {
    puts $t
    set s $t
}
1 2 3 4 5 6 7 8 9 10 {11 12} 13 14 15 16 {{{17} 18} 19} 20 21 22 23 24 25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 {{17} 18} 19 20 21 22 23 24 25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 {17} 18 19 20 21 22 23 24 25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

请注意,如果您在扩展期间的任何时候生成无效列表,这将无效,因此避免使用元字符(尤其是\{})这一点非常重要。在生产代码中做这种事情也不常见;需要它通常表明其他地方出了问题。