我知道你可以在tcl中"破解"嵌套关联数组,我也知道使用字典(我没有经验),你可以很容易地嵌套它们.我试图找到一种方法来存储具有两个变量的函数的值,然后在最后我只想打印出两个变量(列和行标题)的表,其中包含单元格中的函数值.我可以做这项工作,但它既不简洁也不高效.
这是应该打印的内容.行是b的值,列是a的值(1,2,3,4,5为简单起见):
b
1 2 3 4 5
1 y(1,1) y(1,2) y(1,3) y(1,4) y(1,5)
2 y(2,1) y(2,2) y(2,3) y(2,4) y(2,5)
a 3 y(3,1) y(3,2) y(3,3) y(3,4) y(3,5)
4 y(4,1) y(4,2) y(4,3) y(4,4) y(4,5)
5 y(5,1) y(5,2) y(5,3) y(5,4) y(5,5)
Run Code Online (Sandbox Code Playgroud)
为了存储它,我想我会简单地在a和b上做两个嵌套for循环,并以某种方式将结果存储在嵌套字典中.就像有一个带有5个条目的字典,每个b的值为1,并且每个条目是b的每个值的另一个字典.
要打印它,我能想到的唯一方法是只显式打印每个表行并调用每个字典条目.我不太熟悉tcl的输出格式,但我可以在那里管理.
谁能想到更优雅的方式呢?
以下是有关如何使用该struct::matrix软件包的几个示例.
package require struct::matrix
package require Tclx
# Create a 3x4 matrix
set m [::struct::matrix]
$m add rows 3
$m add columns 4
# Populate data
$m set rect 0 0 {
{1 2 3 4}
{5 6 7 8}
{9 10 11 12}
}
# Display it
puts "Print matrix, cell by cell:"
loop y 0 [$m rows] {
loop x 0 [$m columns] {
puts -nonewline [format "%4d" [$m get cell $x $y]]
}
puts ""
}
Run Code Online (Sandbox Code Playgroud)
Print matrix, cell by cell:
1 2 3 4
5 6 7 8
9 10 11 12
Run Code Online (Sandbox Code Playgroud)
set rect给数据填充矩阵.取决于你的需要,你可能想看看set cell,set column或set row.欲了解更多信息,请参阅参考的struct::matrix.for命令,我更喜欢包中的loop命令Tclx,它更易于阅读和使用.package require csv
package require struct::matrix
package require Tclx
# Read a matrix from a CSV file
set m [::struct::matrix]
set fileHandle [open data.csv]
::csv::read2matrix $fileHandle $m "," auto
close $fileHandle
# Displays the matrix
loop y 0 [$m rows] {
loop x 0 [$m columns] {
puts -nonewline [format "%4d" [$m get cell $x $y]]
}
puts ""
}
Run Code Online (Sandbox Code Playgroud)
1,2,3,4
5,6,7,8
9,10,11,12
Run Code Online (Sandbox Code Playgroud)
1 2 3 4
5 6 7 8
9 10 11 12
Run Code Online (Sandbox Code Playgroud)
csv软件包提供了一种从CSV文件读取到矩阵的简单方法.::csv::read2matrix命令中,但在此之前,我必须创建一个空矩阵并打开文件进行读取.虽然struct::matrix包装起初看起来很复杂; 我只需要学习一些命令即可开始使用.
优雅是情人眼中的:)
通过基本的核心 Tcl,我认为您相当了解您的选择。当涉及到面向表格的数据时,数组或嵌套字典都有笨重的边缘。
如果您愿意探索扩展(Tcl 就是扩展),那么您可以考虑标准 Tcl 库中的矩阵包。它将行和列作为关键概念。如果您需要对表格数据进行转换,那么我建议使用 TclRAL,这是一个关系代数库,它定义了关系数据类型,并将处理所有类型的表格数据并提供大量操作。或者,您可以尝试像 SQLite 这样的东西,它也可以处理表格数据,提供操作它并具有强大的持久存储。Tcl wiki 将引导您了解所有这些扩展的详细信息。
然而,如果这些对于您的口味来说似乎太重量级,或者如果您不想承受学习曲线的痛苦,那么卷起袖子并敲出一个数组或嵌套字典解决方案,虽然肯定是相当临时的,但可能并不那么困难。优雅的?好吧,这由你来判断。