从 Tcl 中的 string2 中删除 string1 的重复元素
Remove duplicate elements of string1 from string2 in 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} 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相同,没有重复删除。
如果要输出str2
中的列表中str1
中没有的元素,首先要建立一个元素字典str1
以便您可以使用高效的查找(字典是内部哈希表)。 强烈 建议您为此使用一个过程,因为它使实施更加有效。
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
}]
我想从字符串 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相同,没有重复删除。
如果要输出str2
中的列表中str1
中没有的元素,首先要建立一个元素字典str1
以便您可以使用高效的查找(字典是内部哈希表)。 强烈 建议您为此使用一个过程,因为它使实施更加有效。
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
}]