Scripting 从Tcl中的string2中删除string1的重复元素
我想从字符串2中删除string1的重复元素,然后输出新字符串。我的代码只有在重复元素按顺序排列时才有效。 我想按元素的任何顺序进行操作。请告知 当前代码:Scripting 从Tcl中的string2中删除string1的重复元素,scripting,tcl,Scripting,Tcl,我想从字符串2中删除string1的重复元素,然后输出新字符串。我的代码只有在重复元素按顺序排列时才有效。 我想按元素的任何顺序进行操作。请告知 当前代码: set str1 "a 1 b 2 c 3 X Y Z" set str2 "a 1 b 2 c 3 P Q R" set results {} set results [lmap a_elem $str1 b_elem $str2 { if {$a_elem != $b_elem} {string cat $b_elem}
set str1 "a 1 b 2 c 3 X Y Z"
set str2 "a 1 b 2 c 3 P Q R"
set results {}
set results [lmap a_elem $str1 b_elem $str2 {
if {$a_elem != $b_elem} {string cat $b_elem} else continue
}]
puts $results
以下代码的输出:
pqr
然而,如果
set str1 "a 1 b 2 c 3 X Y Z"
set str2 "P a 2 1 R c Q 3 b"
然后输出为:pa21rcq3b
基本上与str2相同,没有重复删除。如果您想在
str2
中输出那些在str1
中不存在的列表元素,您应该首先构建一个str1
元素字典,以便使用高效查找(dict是内部哈希表)。强烈建议您为此使用一个过程,因为它使实现更加高效
proc removeItems {str1 str2} {
foreach item $str1 {
dict set items $item ""; # Value unimportant
}
lmap item $str2 {
if {[dict exists $items $item]} continue
string cat $item
}
}
puts [removeItems "a 1 b 2 c 3 X Y Z" "P a 2 1 R c Q 3 b"]
# P R Q
代码自然假定str2的顺序很重要。如果要输出str2中列表中
str1
中不存在的元素,应首先构建str1元素字典,以便使用高效查找(dict是内部哈希表)。强烈建议您为此使用一个过程,因为它使实现更加高效
proc removeItems {str1 str2} {
foreach item $str1 {
dict set items $item ""; # Value unimportant
}
lmap item $str2 {
if {[dict exists $items $item]} continue
string cat $item
}
}
puts [removeItems "a 1 b 2 c 3 X Y Z" "P a 2 1 R c Q 3 b"]
# P R Q
代码自然假定str2的顺序很重要。如果性能不重要,可以使用更直接的方法:
set results [lmap elem $str2 {
if {$elem ni $str1} {string cat $elem} else continue
}]
如果性能不重要,您可以使用更直接的方法:
set results [lmap elem $str2 {
if {$elem ni $str1} {string cat $elem} else continue
}]
这回答了你的问题吗?本质上是一样的。你可以根据需要对答案进行调整,只返回差异的一侧。@Jerry是的,这确实回答了我的问题,需要像你提到的那样进行调整。谢谢这回答了你的问题吗?本质上是一样的。你可以根据需要对答案进行调整,只返回差异的一侧。@Jerry是的,这确实回答了我的问题,需要像你提到的那样进行调整。谢谢对于大型数据集,并使其更高效,您的解决方案可以更快地运行。谢谢,对于大型数据集和更高效的解决方案,您的解决方案运行速度更快。谢谢