如何移除两个字符串/字符列表中同索引位置的相同字符?
解决思路与实现方案
这问题核心就是逐索引对比两个序列的元素,只保留同位置不相同的元素就行。我用Python给你写具体实现,不管输入是字符串还是字符列表都能适配,毕竟Python里字符串本身就是可迭代的序列~
核心思路
- 用
zip()(或处理不等长的zip_longest)把两个输入的同索引元素一一配对; - 遍历每一对元素,过滤掉那些相等的元素对;
- 把过滤后的元素分别整理成对应输入类型的结果(字符串拼接成字符串,列表就返回新列表)。
基础实现(假设输入长度相同)
这个版本适配你给出的示例场景,默认两个输入长度一致:
def filter_same_index_chars(a, b): # 过滤同索引相同的元素对 filtered_pairs = [(char_a, char_b) for char_a, char_b in zip(a, b) if char_a != char_b] # 拆分元素对为两个独立序列 filtered_a, filtered_b = zip(*filtered_pairs) if filtered_pairs else ([], []) # 根据输入类型返回对应格式的结果 if isinstance(a, str): return ''.join(filtered_a), ''.join(filtered_b) else: return list(filtered_a), list(filtered_b) # 测试示例1 str1, str2 = "hello", "sello" res1, res2 = filter_same_index_chars(str1, str2) print(res1) # 输出: h print(res2) # 输出: s # 测试示例2 str3, str4 = "sony", "nani" res3, res4 = filter_same_index_chars(str3, str4) print(res3) # 输出: soy print(res4) # 输出: nai # 测试字符列表输入 list1 = ["h","e","l","l","o"] list2 = ["s","e","l","l","o"] res_list1, res_list2 = filter_same_index_chars(list1, list2) print(res_list1) # 输出: ['h'] print(res_list2) # 输出: ['s']
进阶实现(支持不等长输入)
如果你的输入可能存在长度不一致的情况,可以用itertools.zip_longest来处理,超出较短序列长度的元素会全部保留:
from itertools import zip_longest def filter_same_index_chars(a, b): filtered_a = [] filtered_b = [] for x, y in zip_longest(a, b, fillvalue=None): if x != y: # 处理其中一个序列已遍历完的情况 if x is not None: filtered_a.append(x) if y is not None: filtered_b.append(y) # 根据输入类型返回结果 if isinstance(a, str): return ''.join(filtered_a), ''.join(filtered_b) else: return filtered_a, filtered_b # 测试不等长输入 str_short = "abc" str_long = "abcdxyz" res_short, res_long = filter_same_index_chars(str_short, str_long) print(res_short) # 输出: abc print(res_long) # 输出: dxyz
关键细节说明
zip(a, b)会将两个序列的同索引元素配对,当序列长度不同时,会以较短的序列为准截断;zip_longest则会遍历到最长的序列结束,缺少的元素用fillvalue指定的值填充(这里用None标记);- 函数会自动识别输入类型,字符串输入返回字符串结果,列表输入返回列表结果。
内容的提问来源于stack exchange,提问作者Newbie_Coder
相关产品推荐
相关产品推荐

