取列表X的最大值,并将其与列表Y进行比较,并找到Y中的最大值,并使用TCL将其添加到新列表中



我有两个列表,比如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

对于第二个列表的筛选,编写过程是最清楚的。过滤可以通过foreachlmap来实现;后者实际上只是一个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]

最新更新