0

我有一个像这样的列表的 tcl 列表:

{ ab 2 3} { xy 2 5} { tk 4 5 } { wx 1 2}

我想通过子列表的特定索引检查子列表中是否有重复项(这里是前两个子列表的索引 2),并删除该子列表,这里我有前 2 个子列表的 2 @ index 2,所以我想删除第二个子列表最终列表将是

{ ab 2 3} { tk 4 5 } { wx 1 2}

4

3 回答 3

0

受 Donal 回答的启发,该版本应该适用于较旧的 Tcl 版本

proc removeDupsByIndex {list index} {
    set result {}
    array set seen {}
    foreach item $list { 
        set key [lindex $item $index]
        if { ![info exists seen($key)] } {
            set seen($key) 1
            lappend result $item
        }
    }
    return $result
}
于 2013-08-01T19:41:45.193 回答
0

如果您不中间重新排序元素,您可以使用lsort

lsort -unique -index 2 $list
于 2013-08-01T22:05:28.260 回答
0

最简单的方法可能是使用字典来进行重复删除(这意味着我们也可以合理地维护顺序,如果没有大量额外的工作,基于数组的方法可能无法做到这一点)。主要的复杂性是我们需要反向处理事物,因为我们正在寻找第一项而不是最后一项

proc removeDupsByIndex {list index} {
    set d {}
    foreach item [lreverse $list] {
        dict set d [lindex $item $index] $item
    }
    return [lreverse [dict values $d]]
}

set input {{ a b 2 3} { x y 2 5} { t k 4 5 } { w x 1 2}}
set output [removeDupsByIndex $input 2]
puts "input: $input\noutput: $output"
于 2013-08-01T19:20:57.467 回答