Scripting 从Tcl中的string2中删除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}

我想从字符串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} 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是的,这确实回答了我的问题,需要像你提到的那样进行调整。谢谢对于大型数据集,并使其更高效,您的解决方案可以更快地运行。谢谢,对于大型数据集和更高效的解决方案,您的解决方案运行速度更快。谢谢