【问题标题】:Remove duplicate elements of string1 from string2 in Tcl从 Tcl 中的 string2 中删除 string1 的重复元素
【发布时间】:2020-04-07 20:04:50
【问题描述】:

我想从字符串 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    

以下代码的输出: P Q R

但是,如果

set str1 "a 1 b 2 c 3 X Y Z"
set str2 "P a 2 1 R c Q 3 b"

然后输出将是:P a 2 1 R c Q 3 b

与 str2 基本相同,没有重复删除。

【问题讨论】:

  • 这能回答你的问题吗? Comparing two lists and returning the difference 本质上是一样的。您可以根据需要对答案进行调整,以仅返回差异的一侧。
  • @Jerry 是的,这确实回答了我的问题,需要像你提到的那样进行一些调整。谢谢!

标签: scripting tcl


【解决方案1】:

如果你想输出str2list中那些在str1中没有的元素,你应该首先建立一个str1元素的字典,这样你就可以使用高效查找(dicts 是内部哈希表)。 强烈建议您为此使用一个过程,因为它可以提高实施效率。

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 的顺序很重要。

【讨论】:

  • 对于大型数据集并使其更高效,您的解决方案可以更快地运行。谢谢,
【解决方案2】:

如果性能不重要,您可以使用更直接的方法:

set results [lmap elem $str2 {
    if {$elem ni $str1} {string cat $elem} else continue
}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-20
    • 2014-09-09
    • 1970-01-01
    • 2018-02-25
    • 2014-10-08
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    相关资源
    最近更新 更多