用相同的索引排序两个列表

时间:2018-10-26 15:57:12

标签: sorting tcl tclsh

我是tcl的新手。我需要对值列表进行排序并保存索引。 我有2个列表,我想对listA进行排序,但是我想对listB进行排序,以保留listA的索引。

例如:

set listA {5 6 7 3 4 7 8 9}
set listB {0 1 2 3 4 5 6 7}

set sort_listA [lsort $listA]

现在sort_listA将是3 4 5 6 7 7 8 9

我想对listB列表进行排序,并保持与sort_listA相同的索引,例如:

3 4 0 1 2 5 6 7

换句话说,我需要用listA来对两个列表进行排序。 谁能帮我吗?

1 个答案:

答案 0 :(得分:3)

这正是>>> dt = datetime.datetime(2017, 12, 31) >>> dt.strftime('%d%b%Y').upper() # or .str.upper() in Pandas '31DEC2017' 具有lsort选项(要求8.5或更高版本)的任务。代替排序值列表,它以将检索索引以获得排序列表的顺序将索引列表返回到原始列表,这非常适合您的任务。此交互式会话(在Tcl 8.6中,所以我有-indices)是指示性的:

lmap

如果您仍使用8.5,则可以使用% set listA {5 6 7 3 4 7 8 9} 5 6 7 3 4 7 8 9 % set listB {0 1 2 3 4 5 6 7} 0 1 2 3 4 5 6 7 % set idxs [lsort -indices $listA] 3 4 0 1 2 5 6 7 % lmap i $idxs {lindex $listA $i} 3 4 5 6 7 7 8 9 % lmap i $idxs {lindex $listB $i} 3 4 0 1 2 5 6 7 进行重新映射;使用过程更容易:

foreach

现在,在8.4(不再支持!)中,没有索引选项,因此您需要做更多的工作。

proc mapindices {indexlist valuelist} {
    set result {}
    foreach i $indexlist {
        lappend result [lindex $valuelist $i]
    }
    return $result
}
set listA {5 6 7 3 4 7 8 9}
set listB {0 1 2 3 4 5 6 7}
puts [mapindices [lsort -indices $listA] $listB]

但是,到那时,您可能只是将两个列表压缩在一起并可以更直接地工作:

proc lsortIndices {list} {
    # Pair each value up with its index
    set zipped {}
    set idx -1
    foreach val $list {
        lappend zipped [list [incr idx] $val]
    }

    # Do the sorting by the value of the pair
    set sorted [lsort -index 1 $zipped]

    # Unpack the indices from the pairs to get the result
    set result {}
    foreach pair $sorted {
        lappend result [lindex $pair 0]
    }
    return $result
}

使用Tcl 8.4以上的旧版本需要您使用set zipped {} foreach valA $listA valB $listB { lappend zipped [list $valA $valB] } set sorted [lsort -index 0 $zipped] set listAsorted {} set listBsorted {} foreach pair $sorted { lappend listAsorted [lindex $pair 0] lappend listBsorted [lindex $pair 1] } 选项,这确实很慢。