首页 > 解决方案 > 在 Tcl 中查找列表元素之间的差异

问题描述

我是使用 Tcl 的初学者。我将它用作 VMD(分子可视化)软件将其用作脚本语言。
我有一个蛋白质的原子位置坐标列表,例如:{{1 2 3} {7 9 13}, ...}我有一个具有不同位置的相同长度的单独列表说:{{3 5 2} {7 3 8}, ...}
VMD 有一个内置vecsub函数,可以减去{1 2 3}{3 5 2}给出{-2 -3 1}。我编写了一个foreach循环来迭代整个列表并计算vecsub.
我的代码如下:\

set sel1 [atomselect 0 "protein"] # selecting protein1
set sel2 [atomselect 1 "protein"] # selecting protein2
# create a list of same length as protein to store values
# $sel1 get index returns length of protein
foreach i [$sel1 get index] {
    lappend x 0 
}
# veclength2 returns square of vector length
# $sel1 get {x y z} returns a position list as described earlier
foreach i [$sel1 get index] {
    lset x $i [expr [veclength2 [vecsub [lindex [$sel1 get {x y z}] $i] [lindex [$sel2 get {x y z}] $i]]]]
}

在 Tcl 中是否有另一种方法可以做到这一点?也许类似于 python 数组减法?

标签: tclvmd

解决方案


我会试试这个,但这只是一个猜测

set x [lmap p1 [$sel1 get {x y z}] p2 [$sel2 get {x y z}] {
    expr [veclength2 [vecsub $p1 $p2]]
}]

有了这个,就不需要预先声明了$x


推荐阅读