我新手,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!"}
但是,當我打印子表元素我看到他們是平等的,但如果聲明沒有抓住它。爲什麼?我應該如何處理這個比較?
我新手,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!"}
但是,當我打印子表元素我看到他們是平等的,但如果聲明沒有抓住它。爲什麼?我應該如何處理這個比較?
如果我要實現一個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」 – 2012-05-07 06:22:08
它們並不相同,並且您正確地測試了它。當然你打印正確的變量?
編輯:行爲對我來說。
# 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!
#
我會做:
# from tcllib
package require struct::list
if {[::struct::list equal $list1 $list2]} { puts "Lists are equal"}
#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)"
}
}
請注意,使用'eq'來比較這些元素,而不是'=='(它實際上只是數字相等)。 – 2011-03-05 01:24:27