如果子列表中有重复项,则从tcl列表中删除子列表

时间:2013-08-01 18:57:38

标签: list tcl duplicate-removal

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

{ a b 2 3} { x y 2 5} { t k 4 5 } { w x 1 2}

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

{ a b 2 3}  { t k 4 5 } { w x 1 2}

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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
}

答案 2 :(得分:0)

如果您没有重新排序元素,可以使用lsort

lsort -unique -index 2 $list