Tcl 后缀递增的lsort

Tcl 后缀递增的lsort,tcl,Tcl,如何对以下列表进行排序 GLU_43 GLY_8 VAL_11 ILE_13 TYR_15 LYS_16 VAL_18 LYS_36 ASP_19 LEU 20 Seru 21 LYS_22 VAL_23 Seru 25 LYS_26 GLY_7 CYS_27 VAL_14 GLY_28 THR_24 Seru 29 LEU 30 GLY_31 GLY_9 ASN_32 GLN_12 ILE 33 HIE_35 PRO 37 GLY_38 GLY_40 GLY_17 GLY_亲GLY_10_ 作

如何对以下列表进行排序

GLU_43 GLY_8 VAL_11 ILE_13 TYR_15 LYS_16 VAL_18 LYS_36 ASP_19 LEU 20 Seru 21 LYS_22 VAL_23 Seru 25 LYS_26 GLY_7 CYS_27 VAL_14 GLY_28 THR_24 Seru 29 LEU 30 GLY_31 GLY_9 ASN_32 GLN_12 ILE 33 HIE_35 PRO 37 GLY_38 GLY_40 GLY_17 GLY_亲GLY_10_

作为增加后缀的函数,如下所示:

亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本亲本


如果我们将
lsort
-index
选项一起使用,我们将恢复要应用的列表的重新排序。这意味着我们可以提取第二部分,获得排序顺序,然后将其应用于原始列表以获得我们想要的结果

set input {GLU_43 GLY_8 VAL_11 ILE_13 TYR_15 LYS_16 VAL_18 LYS_36 ASP_19 LEU_20 SER_21 LYS_22 VAL_23 SER_25 LYS_26 GLY_7 CYS_27 VAL_14 GLY_28 THR_24 SER_29 LEU_30 GLY_31 GLY_9 ASN_32 GLN_12 ILE_33 HIE_34 HIE_35 PRO_37 GLY_38 GLY_39 PRO_17 GLY_40 GLN_41 VAL_42 PRO_6 LYS_10}

# Get the suffixes
set suffixes [lmap item $input {  lindex [split $item "_"] 1  }]
# Sort them as numbers, getting the target sorting order
set order [lsort -integer -indices $suffixes]
# Apply the ordering to the input list
set output [lmap index $order {  lindex $input $index  }]
# Print the result
puts $output
我得到这个结果:
PRO_6 GLY_7 GLY_8 GLY_9 LYS_10 VAL_11 GLN_12 ileu 13 VAL_14 TYR_15 LYS_16 PRO_17 VAL_18 ASP_19 LEU 20 SER_21 LYS_22 VAL_23 THR_24 SER_25 LYS 26 CYS_27 GLY_28 SER_29 LEU 30 GLY_31 ASN_32 ileu 33 HIE 34 HIE_35 LYS u 36 PRO 37 GLY_40 GLU 43>


如果您使用的是Tcl 8.5,您没有
lmap
,必须用
foreach
替换:

# Get the suffixes
set suffixes {}
foreach item $input {
    lappend suffixes [lindex [split $item "_"] 1]
}
# Sort them as numbers, getting the target sorting order
set order [lsort -integer -indices $suffixes]
# Apply the ordering to the input list
set output {}
foreach index $order {
    lappend output [lindex $input $index]
}

在8.6中使用
lmap
生成的字节码实际上是相同的。

一个使用
lsort
-index
选项的版本和一个:


基本上,它将原始列表中的每个元素转换为一个以下划线分隔的两元素列表,根据每个子列表的第二个元素对列表进行排序,然后将它们再次合并为字符串列表。

非常感谢简洁的建议非常感谢简洁的建议@你应该接受你的答案。目前lmap命令在嵌入VMD的tcl版本中不起作用。因此,我使用了带有lappend命令的版本。无论如何谢谢你。。。
#!/usr/bin/env tclsh

set lst {GLU_43 GLY_8 VAL_11 ILE_13 TYR_15 LYS_16 VAL_18 LYS_36 ASP_19
    LEU_20 SER_21 LYS_22 VAL_23 SER_25 LYS_26 GLY_7 CYS_27 VAL_14 GLY_28
    THR_24 SER_29 LEU_30 GLY_31 GLY_9 ASN_32 GLN_12 ILE_33 HIE_34 HIE_35
    PRO_37 GLY_38 GLY_39 PRO_17 GLY_40 GLN_41 VAL_42 PRO_6 LYS_10}

set lst [lmap elem [lsort -integer -index 1 [lmap elem $lst { split $elem _ }]] {
    join $elem _
}]

puts $lst