返回tcl 8.4中列表列表中重复项的索引

时间:2012-09-03 13:16:01

标签: list tcl

我有这样的清单: {A D C} {D S D} {A S D} {Y D D}

我想在子列表的相同索引中列出所有具有重复项的索引。 例如,如果我想在子列表中搜索索引2处的每个“D”,我想知道列表的索引(这里是0和3)

这是代码:

proc findElement {lst idx value} {
    set i 0
    foreach sublist $lst {
        if {[string equal [lindex $sublist $idx] $value]} {
            return $i
        }
        incr i
    }
    return -1
}

当我称之为findElement $ toto 1 D

它只返回0!

为什么?

2 个答案:

答案 0 :(得分:3)

因为当$ i = 0时找到匹配项时有一个return语句。

尝试以下操作,而不是返回所有匹配索引的列表

proc findElement {lst idx value} {
    set i 0
    set return_list [list]
    foreach sublist $lst {
       puts "i=$i sublist=$sublist"
        if {[string equal [lindex $sublist $idx] $value]} {
            puts "Found $i"
            lappend return_list $i
        }
        incr i
    }
    return $return_list
}

答案 1 :(得分:2)

您可以使用lsearch -all -exact -index制作更短,更快的版本。

proc findElement {lst idx value} {
   return [lsearch -all -exact -index $idx $lst $value]
}