Как правильно сравнивать два списка в TCL? - PullRequest
1 голос
/ 04 марта 2011

Я новичок в 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 не улавливает его. Зачем? Как мне исправить это сравнение?

Ответы [ 4 ]

6 голосов
/ 04 марта 2011

Я бы сделал:

# from tcllib
package require struct::list


if {[::struct::list equal $list1 $list2]} { puts "Lists are equal"}
1 голос
/ 10 января 2015
#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)"
    }
}
1 голос
/ 04 марта 2011

Если бы я реализовал процесс 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}]
}
1 голос
/ 04 марта 2011

Они не равны, и вы правильно проверяете это.Вы уверены, что печатаете правильные переменные?

РЕДАКТИРОВАТЬ: Поведение для меня.

# 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!
#
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...