如何移除两个列表间的共有元素,保留各自独有元素?
在Tcl中移除两个列表的共有元素
要实现移除两个列表的共有元素,核心是先找出两组列表的交集,再分别从原列表里剔除这些共有元素。下面给出两种实用的实现方式:
方法一:保留原列表元素顺序
如果需要维持原列表里元素的先后顺序,用这种方法:
# 定义原始列表 set list_1 [list a b c d] set list_2 [list e f b a] # 把list_2的元素存入数组,方便快速判断元素是否存在 array set elem_in_list2 {} foreach elem $list_2 { set elem_in_list2($elem) 1 } # 过滤list_1,只保留不在list_2中的元素 set list_1_remove_identical [lsearch -all -inline -not -exact $list_1 {*}[array names elem_in_list2]] # 同理处理list_2 array set elem_in_list1 {} foreach elem $list_1 { set elem_in_list1($elem) 1 } set list_2_remove_identical [lsearch -all -inline -not -exact $list_2 {*}[array names elem_in_list1]] # 输出结果 puts $list_1_remove_identical ;# 输出:c d puts $list_2_remove_identical ;# 输出:e f
方法二:用struct::set包(简洁但不保留顺序)
如果不需要维持原列表的元素顺序,可以用Tcl的struct::set包简化代码:
# 加载集合处理包 package require struct::set set list_1 [list a b c d] set list_2 [list e f b a] # 计算两个列表的交集 set common_elements [struct::set intersect $list_1 $list_2] # 分别求差集得到去重后的列表 set list_1_remove_identical [struct::set difference $list_1 $common_elements] set list_2_remove_identical [struct::set difference $list_2 $common_elements] puts $list_1_remove_identical ;# 输出元素为c、d,顺序可能因集合特性变化 puts $list_2_remove_identical ;# 输出元素为e、f
内容的提问来源于stack exchange,提问作者Linh Trần Quang
相关产品推荐
相关产品推荐

