如何在tcl中比较两个列表(包含字符和数字)?

德万南德

我有两个名为hga和的列表bbb我正在tcl从名为的软​​件中使用VMD现在,我想通过在这些列表中找到常见残基和不同残基来比较这些列表。我怎样才能做到这一点?

% set hga [atomselect 0 "name CA and within 8 of resname HEM"]
% set bbb [atomselect 1 "name CA and within 8 of resname HEM"]
% $hga get {resname resid}
% $bbb get {resname resid}

resname部分是字符,resid部分是数字。


更新:使用package require struct给我错误。而且我不是root用户。

狼锤

我没有VMD,所以我从示例输出中获取了proc。该脚本查找具有相同属性值的索引。您需要设置属性并在获取中使用它们。例子:

set attrs {name backbone}
set values [$sel get $attrs]
set answer [same_values $attrs $values]

测试脚本

#!/usr/bin/tclsh

# http://www.ks.uiuc.edu/Research/vmd/vmd-1.7/ug/node181.html
# $sel get {attr1 attr2}
# is a list of sublists. {attr1 attr2} {attr1 attr2} ...

set attrs {name backbone}
set values "{N 1} {H 0} {CA 1} {CB 0} {C 1} {O 1}"

proc same_values {attrs values} {
    set len [llength $values]
    set "matches(_ATTRIBUTE VALUE)" INDEXES
    set attrs_length [llength $attrs]

    for {set i 0} {$i < $len} {incr i} {
        set item_a [lindex $values $i]
        set search_indexes [list]

        for {set k 0} {$k < $attrs_length} {incr k} {
            set key [list [lindex $attrs $k] [lindex $item_a $k]]
            if {![info exists "matches($key)"]} {
                # value hasn't been indexed.
                # create index list and add to search list
                set "matches($key)" [list $i]
                lappend search_indexes $k
            }
        }

        # continue if we don't have anything to search
        if {[llength $search_indexes] == 0} {continue}

        # search the rest of the list for matches
        for {set j [expr $i + 1]} {$j < $len} {incr j} {
            set item_b [lindex $values $j]

            foreach {k} $search_indexes {
                set a [lindex $item_a $k]
                set b [lindex $item_b $k]
                set attr [lindex $attrs $k]

                if {$a == $b} {
                    set key [list $attr $a]
                    lappend "matches($key)" $j
                }
            }
        }
    }

    set result [list]
    set keys [lsort [array names matches]]

    foreach {key} $keys {
        lappend result $key "$matches($key)"
    }

    return $result
}

set answer [same_values $attrs $values]

foreach {attr_value indexes} $answer {
    puts "$attr_value = $indexes"
}

输出:

% ./test.tcl
_ATTRIBUTE VALUE = INDEXES
backbone 0 = 1 3
backbone 1 = 0 2 4 5
name C = 4
name CA = 2
name CB = 3
name H = 1
name N = 0
name O = 5

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Clojure中比较/减去两个列表

来自分类Dev

如何在android中比较两个edittext字段

来自分类Dev

如何在Dart中比较两个相等且包含相同对象的列表?

来自分类Dev

如何在JavaScript中比较两个日期时间?

来自分类Dev

如何在LINQ中比较两个匿名变量列表

来自分类Dev

如何在C中比较两个以上的字符串?

来自分类Dev

如何在露天javascript中比较两个noderefs

来自分类Dev

如何在python中比较两个时区?

来自分类Dev

如何在C ++中比较两个结构字符串

来自分类Dev

如何在Java中比较两个哈希映射

来自分类Dev

如何在Matlab中比较两个未排序的列表?

来自分类Dev

如何在python中比较两个时间字段

来自分类Dev

如何在tcl中比较两个列表(包含字符和数字)?

来自分类Dev

如何在python中比较两个列表

来自分类Dev

如何在C#中比较两个对象列表?

来自分类Dev

如何在Windows中比较两个csv文件

来自分类Dev

如何在Postgresql中比较两个表?

来自分类Dev

如何在JUnit中比较两个double列表

来自分类Dev

如何在Java中比较两个图像

来自分类Dev

如何在C#中比较两个列表?

来自分类Dev

如何在Python中比较两个列表并计算所有匹配项?

来自分类Dev

如何在flutter中比较两个列表数据(飞镖)

来自分类Dev

如何在python中比较两个无限大的数字

来自分类Dev

如何在Python中比较两个列表中的值?

来自分类Dev

如何在C中比较两个以上的字符串?

来自分类Dev

如何在Shell脚本中比较两个文件的字符串?

来自分类Dev

如何在Python中比较两个以上的列表?

来自分类Dev

如何在MySQL中比较两个数字作为字符串?

来自分类Dev

如何在javascript中比较两个列表项?

Related 相关文章

热门标签

归档