按后缀升序排序
lsort with increasing order of suffix
如何对以下列表进行排序
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
作为增加后缀的函数,如下所示:
PRO_6 GLY_7 GLY_8 GLY_9 LYS_10 VAL_11 GLN_12 ILE_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 ILE_33 HIE_34 HIE_35 LYS_36 PRO_37 GLY_38 GLY_39 GLY_40 GLN_41 VAL_42 GLU_43
如果我们将 lsort
与 -indices
选项一起使用,我们将返回我们想要应用的列表的重新排序。这意味着我们可以提取第二部分,获取排序顺序,然后将其应用于原始列表以获得我们想要的结果。
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 ILE_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 ILE_33 HIE_34 HIE_35 LYS_36 PRO_37 GLY_38 GLY_39 GLY_40 GLN_41 VAL_42 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
选项和 Schwartzian Transform:
的版本
#!/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
基本上,它将原始列表的每个元素转换为下划线分割的双元素列表,根据每个子列表的第二个元素对该列表列表进行排序,然后再次将它们连接成一个字符串列表。
如何对以下列表进行排序
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
作为增加后缀的函数,如下所示:
PRO_6 GLY_7 GLY_8 GLY_9 LYS_10 VAL_11 GLN_12 ILE_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 ILE_33 HIE_34 HIE_35 LYS_36 PRO_37 GLY_38 GLY_39 GLY_40 GLN_41 VAL_42 GLU_43
如果我们将 lsort
与 -indices
选项一起使用,我们将返回我们想要应用的列表的重新排序。这意味着我们可以提取第二部分,获取排序顺序,然后将其应用于原始列表以获得我们想要的结果。
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 ILE_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 ILE_33 HIE_34 HIE_35 LYS_36 PRO_37 GLY_38 GLY_39 GLY_40 GLN_41 VAL_42 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
选项和 Schwartzian Transform:
#!/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
基本上,它将原始列表的每个元素转换为下划线分割的双元素列表,根据每个子列表的第二个元素对该列表列表进行排序,然后再次将它们连接成一个字符串列表。