-1

我想将两个列表与科学值进行比较,并将最高值存储在新列表中。可以说,

set X_value [list 1.215647671415354e-7 1.1284486163276597e-6 0.00019818406144622713 2.9287846814440854e-7 2.0217831320223922e-7]

set Y_value [list 1.215647671415354e-7 1.1284486163276597e-6 4.538622670224868e-5 4.4706815970130265e-5 8.492852430208586e-6 6.077577836549608e-6 3.1041158763400745e-6 0.00015045881445985287 4.1016753016265284e-7 1.165599314845167e-6 1.8736355968940188e-6 2.9444883693940938e-5 2.5420340534765273e-5 2.0819682049477706e-6 9.529731869406532e-6 8.549810104341304e-7 1.558014082547743e-5 8.079621693468653e-6 4.868444739258848e-5 0.0001646481396164745]

需要将 X_value 的每个值与 Y_value 进行比较,并将 Y_value 的较高值添加到新列表中。由于我是 TCL 新手,我发现很难实现这一点。

4

1 回答 1

1

假设您要进行成对比较,从中累积一个新的值列表,该列表X_Value大于 中的相应值,并在一列表用完后Y_Value停止:

proc pick_excess {X_list Y_list} {
    set result {}
    foreach x $X_list y $Y_list {
        if {($x ne "") && ($y ne "") && ($x > $y)} {
            lappend result $x
        }
    }
    return $result
}
puts [pick_excess $X_Value $Y_Value]

或者改用这个(避免字符串比较):

proc pick_excess {X_list Y_list} {
    set limit [expr {min([llength $X_list], [llength $Y_list]) - 1}]
    return [lmap x [lrange $X_list 0 $limit] y [lrange $Y_list 0 $limit] {
        string cat [expr {$x <= $y ? continue : $x}]
    }]
}
puts [pick_excess $X_Value $Y_Value]

意识到!您正在比较(双精度)浮点数,通常最好仔细考虑浮点数何时应该被认为是相等的,因为产生“相同”值的两种方法实际上可能产生不同的值由最低有效位(或更多,如果其中一种算法不是很好)。当心。

于 2020-06-04T08:20:09.713 回答