从TCL列表中删除一个子表,如果你有子列表中的重复项目

我列出的这样的TCL列表:从TCL列表中删除一个子表,如果你有子列表中的重复项目

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

我想通过子表的特定指标来检查我是否有重复在子列表(这里前两个子表的索引2), 并删除子表的项目,在这里我有2 @第一2子表的索引2,所以我想删除第二子列表 最终名单将

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

回答:

最简单的方法可能是使用字典来做重复删除(这意味着我们也可以获得reaso可以维护订单,这是一个基于数组的方法,如果没有大量额外的工作可能不会做)。主要并发症是,我们需要处理反向的事情,因为我们正在寻找的第一项目,而不是最后

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"

回答:

由多纳尔的回答,应在旧的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

}

回答:

版本如果不重新排序中期的元素,你可以使用lsort

lsort -unique -index 2 $list 

以上是 从TCL列表中删除一个子表,如果你有子列表中的重复项目 的全部内容, 来源链接: utcz.com/qa/258322.html

回到顶部