我有两个列表,比如X和Y.找到列表X的最大值,并将其与列表Y的值进行比较,如果Y的值大于X,则使用TCL将其添加到新列表中。
set X[list 1.2156476714e-04 1.1284486163e-03 1.9818406145e-01 2.9287846814e-04 2.0217831320e-04]
set Y[list 1.2156476714e-04 1.1284486163e-03 4.5386226702e-02 4.4706815970e-02 8.4928524302e-03 6.0775778365e-03 3.1041158763e-03 1.5045881446e-01 4.1016753016e-04 1.1655993148e-03 1.8736355969e-03 2.9444883694e-02 2.5420340535e-02 2.0819682049e-03 9.5297318694e-03 8.5498101043e-04 1.5580140825e-02 8.0796216935e-03 4.8684447393e-02 1.6464813962e-01]
取列表 X 的最大值,将其与列表 Y 的每个值进行比较。如果列表 Y 的值大于 X 值,则将其添加到新列表中。
找到事物的最大值是max()
函数(在expr
中(的事情,除了我们想将其应用于列表,所以我们直接调用函数的实现命令,以便我们可以通过扩展输入值列表:
set max_X [tcl::mathfunc::max {*}$X]
# ^^^^^^^^^^^^^^^ ^^^ Expansion: pass what follows as many arguments
# Function calls get transformed into invokes of commands in the tcl::mathfunc namespace
对于第二个列表的筛选,编写过程是最清楚的。过滤可以通过foreach
或lmap
来实现;后者实际上只是一个foreach
,如果它们是正常结果而不是像continue
这样的东西,它会收集值。
这两个版本的过程基本上执行相同的操作:
proc filter_greater_than {value list} {
lmap x $list {expr {$x > $value ? $x : [continue]}}
}
proc filter_greater_than {value list} {
set result {}
foreach x $list {
if {$x > $value} {
lappend result $x
}
}
return $result
}
然后,使用如下所示的过程:
set new_list [filter_greater_than $max_X $Y]