我列出的這樣的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}
我列出的這樣的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
}
謝謝你的迴應,Jackman的回答很好。 – noname
@noname我建議你接受最能幫助你的答案。 –
版本如果不重新排序中期的元素,你可以使用lsort
:
lsort -unique -index 2 $list
塔nks但lreverse命令不適用於我,我可能會遇到未知的命令錯誤 – noname
您運行的是哪個版本的tcl? 'set version [info patchlevel]' –
你還在8.4(或之前!)?獲得該計劃,男人!升級到目前*開發人員實際支持*的版本... –