【问题标题】:What is the right way of comparing two lists in TCL?在 TCL 中比较两个列表的正确方法是什么?
【发布时间】:2011-03-04 14:39:02
【问题描述】:

我是 TCL 的新手,我写了以下代码:

set list1 {{1 2} 3 4}
set list2 {{1 2} 8 1}
if {[lindex $list1 0] == [lindex $list2 0]} { puts "They are equal!"}

但是当我打印子列表元素时,我看到它们是相等的,但是 if 语句没有捕捉到它。为什么?我应该如何纠正这种比较?

【问题讨论】:

  • 附带说明,使用eq 比较这些元素,而不是==(这实际上只是数字相等)。

标签: list compare tcl


【解决方案1】:

我愿意:

# from tcllib
package require struct::list


if {[::struct::list equal $list1 $list2]} { puts "Lists are equal"}

【讨论】:

    【解决方案2】:

    如果我要实现一个lequal proc,我会从这个开始:

    proc lequal {l1 l2} {
        foreach elem $l1 {
            if {$elem ni $l2} {return false}
        }
        foreach elem $l2 {
            if {$elem ni $l1} {return false}
        }
        return true
    }
    

    然后优化到这个:

    proc K {a b} {return $a}
    
    proc lequal {l1 l2} {
        if {[llength $l1] != [llength $l2]} {
            return false
        }
    
        set l2 [lsort $l2]
    
        foreach elem $l1 {
            set idx [lsearch -exact -sorted $l2 $elem]
            if {$idx == -1} {
                return false
            } else {
                set l2 [lreplace [K $l2 [unset l2]] $idx $idx]
            }
        }
    
        return [expr {[llength $l2] == 0}]
    }
    

    【讨论】:

    • 您为什么将这些与订单无关?这是一个很好的比较,但不是我所说的列表平等。你的版本就像说字符串相等应该匹配 "team"=="mate"
    【解决方案3】:

    它们不相等,您对此进行了正确测试。确定您打印的是正确的变量?

    编辑:我的行为。

    # cat test.tcl
    set list1 {{1 2} 3 4}
    set list2 {{1 2} 8 1}
    if {[lindex $list1 0] == [lindex $list2 0]} { puts "They are equal!"}
    # tclsh test.tcl
    They are equal!
    #
    

    【讨论】:

    • 对不起,这个例子不对:)!我打印我比较的内容,我发现它们是相等的。
    【解决方案4】:
    #compare two lists with hash table
    if {[llength $list1] ne [llength $list2]} {
        puts "number of list elements is different"
    } else {
        puts "there are [llength $list1] list elements"
    }
    set i 1
    foreach a {$list1} b {$list2} {
        set a($i) $a
        set b($i) $b
        incr i
    }
    for {set j 1} {$j <= [llength $list1]} {incr j} {
        if { $a($j) ne $b($j) } {
            puts "No Match $a($j) $b($j)"
        } else {
          puts "Match $a($j) $b($j)"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2018-05-21
      • 1970-01-01
      相关资源
      最近更新 更多