如何动态创建列表列表?
How do I dynamically create a list of lists?
我知道我可以创建一个 "list of lists" 如下所示,但我想创建 "d" 作为过程的一部分(附加 $x (x=a,b,c )动态)。
有人可以帮我理解这个吗?我不相信 lappend 可以使用它,因为它只会将列表元素添加到现有列表中。所以这是一个二维列表。创建二维列表后,我很清楚如何访问嵌套列表。有什么想法吗?
set a [list x y z]
set b [list u v w]
set c [list i j k]
set d [list $a $b $c] #I want to create this as a part of a procedure
foreach m $d {
puts "++++++++++++"
foreach n $m {
puts $n
}
}
sleepy> ./listOflist.tcl
+++++++
x
y
z
+++++++
u
v
w
+++++++
i
j
k
sleepy>
在最简单的情况下,您只需执行:
proc 2D {m n} {
set result {}
set letter 96
for {set i 0} {$i < $m} {incr i} {
set row {}
for {set j 0} {$j < $n} {incr j} {
lappend row [format "%c" [incr letter]]
}
lappend result $row
}
return $result
}
很好,但是如果您想扩展其中一个内部行? lset
!它允许您在任何列表的末尾后的任何深度放置一个元素。
% set basic2Darray [2D 3 3]
{a b c} {d e f} {g h i}
% lset basic2Darray 0 end+1 x; # <<< see the end+1?
{a b c x} {d e f} {g h i}
我知道我可以创建一个 "list of lists" 如下所示,但我想创建 "d" 作为过程的一部分(附加 $x (x=a,b,c )动态)。 有人可以帮我理解这个吗?我不相信 lappend 可以使用它,因为它只会将列表元素添加到现有列表中。所以这是一个二维列表。创建二维列表后,我很清楚如何访问嵌套列表。有什么想法吗?
set a [list x y z]
set b [list u v w]
set c [list i j k]
set d [list $a $b $c] #I want to create this as a part of a procedure
foreach m $d {
puts "++++++++++++"
foreach n $m {
puts $n
}
}
sleepy> ./listOflist.tcl
+++++++
x
y
z
+++++++
u
v
w
+++++++
i
j
k
sleepy>
在最简单的情况下,您只需执行:
proc 2D {m n} {
set result {}
set letter 96
for {set i 0} {$i < $m} {incr i} {
set row {}
for {set j 0} {$j < $n} {incr j} {
lappend row [format "%c" [incr letter]]
}
lappend result $row
}
return $result
}
很好,但是如果您想扩展其中一个内部行? lset
!它允许您在任何列表的末尾后的任何深度放置一个元素。
% set basic2Darray [2D 3 3]
{a b c} {d e f} {g h i}
% lset basic2Darray 0 end+1 x; # <<< see the end+1?
{a b c x} {d e f} {g h i}