List 在TCL中比较两个列表的正确方法是什么?

List 在TCL中比较两个列表的正确方法是什么?,list,compare,tcl,List,Compare,Tcl,我是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语句没有捕捉到它。为什么?我应该如何纠正这个比较?它们不相等,你可以正确地进行测试。确定打印的变量正确吗 编辑:我的行为 # cat test.tcl set list1 {{1

我是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语句没有捕捉到它。为什么?我应该如何纠正这个比较?

它们不相等,你可以正确地进行测试。确定打印的变量正确吗

编辑:我的行为

# 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!
#

它们是不相等的,你可以正确地进行测试。确定打印的变量正确吗

编辑:我的行为

# 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!
#
如果我要实现一个lequal过程,我会从以下内容开始:

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}]
}
如果我要实现一个lequal过程,我会从以下内容开始:

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}]
}
我会:

# from tcllib
package require struct::list


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

# from tcllib
package require struct::list


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

抱歉,示例不正确:!我打印了我比较的内容,我发现它们是相等的。对不起,示例不正确:!我打印了我比较的内容,我看到它们是相等的。作为旁注,使用eq来比较这些元素,而不是==这只是真正的数字相等。作为旁注,使用eq来比较这些元素,而不是==这只是真正的数字相等。为什么要将它们作为独立顺序进行比较?这是一个很好的比较,但不是我所说的列表平等。您的版本就像是说字符串相等应该匹配team==mate为什么要将它们作为顺序独立的进行比较?这是一个很好的比较,但不是我所说的列表平等。您的版本类似于说字符串相等应该匹配team==mate