如何在Python中不区分大小写地从字符串集合中移除指定字符串?
问题
处理Wikidata数据时,遇到这样的场景:字符串集合categories中存在需要移除的Articles containing video clips,但该字符串在其他集合中还会以小写首字母的articles containing video clips形式出现。
目前用的简单移除方式是:
setA.discard("Articles containing video clips").discard("articles containing video clips")
这种方法在简单场景下足够用,但复杂场景里扩展性差。除了用casefold()比较的循环或列表/集合推导式之外,还有没有其他实现方式?(示例推导式代码如下)
unwantedString = 'Articles containing video clip' setA = {'tsunami', 'articles containing video clip'} reducedSetA = {nonmatch for nonmatch in setA if nonmatch.casefold() != unwantedString.casefold()} print(reducedSetA) # 输出: {'tsunami'}
注意:这并非字符串替换场景,而是从字符串集合中移除指定字符串的操作。
解决方案
- 方法一:集合差集 + 映射转换
先给原集合的每个字符串建立casefold()后的映射,找出所有和目标字符串大小写不匹配但内容一致的元素,再通过集合差集直接移除,不用写推导式循环:
unwanted = 'Articles containing video clips' setA = {'tsunami', 'Articles containing video clips', 'articles containing video clips', 'earthquake'} # 构建原始字符串到小写归一化的映射 case_map = {s: s.casefold() for s in setA} # 筛选出所有需要移除的原始字符串 to_remove = {s for s, cf_val in case_map.items() if cf_val == unwanted.casefold()} # 差集操作得到最终集合 reduced_set = setA - to_remove print(reduced_set) # 输出: {'tsunami', 'earthquake'}
- 方法二:filter()函数过滤
用filter()搭配匿名函数直接过滤掉目标元素,代码更紧凑:
unwanted = 'Articles containing video clips' setA = {'tsunami', 'Articles containing video clips', 'articles containing video clips', 'earthquake'} reduced_set = set(filter(lambda x: x.casefold() != unwanted.casefold(), setA)) print(reduced_set) # 输出: {'tsunami', 'earthquake'}
- 方法三:自定义大小写不敏感集合类(适合高频操作)
如果需要反复进行这类大小写不敏感的移除操作,可以自定义一个集合类,封装好逻辑,之后直接调用方法即可:
class CaseInsensitiveSet(set): def discard_case(self, item): target_cf = item.casefold() # 找到所有匹配的元素并移除 self -= {s for s in self if s.casefold() == target_cf} # 使用示例 unwanted = 'Articles containing video clips' setA = CaseInsensitiveSet({'tsunami', 'Articles containing video clips', 'articles containing video clips', 'earthquake'}) setA.discard_case(unwanted) print(setA) # 输出: {'tsunami', 'earthquake'}
内容的提问来源于stack exchange,提问作者mfeb
相关产品推荐
相关产品推荐

