2016-01-12 2 views
0

Преобразование списка в один список. например: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}
обращенным в
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}

Как преобразовать его ??

+0

Это простая задача, используя рекурсивную функцию. Что у вас есть до сих пор? – Ctx

ответ

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 

Обратите внимание, что это не будет работать, если вы производите неверный список в любой момент в процессе расширения, следовательно, почему это важно избегать метасимволов (особенно \, { и }). Также не обычно делать такие вещи в производственном коде; нуждающийся в этом, как правило, указывает на то, что в другом месте пошло не так.

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

 Смежные вопросы

  • Нет связанных вопросов^_^