如何从包含无序多元素字符串的列表中获取去重后的唯一项
解决方法
核心思路是先对每个字符串做标准化处理,消除元素顺序的影响后再去重:
- 把每个逗号分隔的字符串拆分成单个元素的列表
- 对拆分后的列表做排序
- 重新拼接为字符串,此时元素顺序不同但内容相同的项会得到完全相同的标准化字符串
- 基于标准化后的字符串用set去重即可
代码示例(保留原始项格式)
如果需要保留列表中第一次出现的原始格式的元素,用以下实现:
original_list = [ '0D', '0A,0C', '0C,0A', '0C,0E,0D,0F', '0C,0D,0E,0F', '0B,0G', '0B,0F' ] seen = set() unique_items = [] for item in original_list: # 生成标准化key key = ','.join(sorted(item.split(','))) if key not in seen: seen.add(key) unique_items.append(item) print(unique_items) # 输出:['0D', '0A,0C', '0C,0E,0D,0F', '0B,0G', '0B,0F']
代码示例(仅保留标准化后格式)
如果不需要保留原始顺序的格式,可以直接用一行生成去重后的标准化列表:
unique_normalized = list({','.join(sorted(item.split(','))) for item in original_list}) print(unique_normalized) # 输出:['0D', '0A,0C', '0C,0D,0E,0F', '0B,0G', '0B,0F']
原理说明
直接用set(original_list)去重无效,是因为Python字符串对比是逐字符按顺序匹配,'0A,0C'和'0C,0A'的字面值不同,会被判定为不同元素。通过排序后生成标准化key的方式,消除了元素排列顺序对匹配结果的影响,就能实现同类项的合并。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

