您已经有了几个很好的答案,下面的代码对于您的用例来说可能是多余的,但只是为了好玩,我创建了一个简单的不区分大小写的可变集合类。请注意,它会保留它找到的 first 字符串,而不是让它被后面的条目破坏。
import collections.abc
class CasefoldSet(collections.abc.MutableSet):
def __init__(self, iterable=None):
self.elements = {}
if iterable is not None:
for v in iterable:
self.add(v)
def __contains__(self, value):
return value.casefold() in self.elements
def add(self, value):
key = value.casefold()
if key not in self.elements:
self.elements[key] = value
def discard(self, value):
key = value.casefold()
if key in self.elements:
del self.elements[key]
def __len__(self):
return len(self.elements)
def __iter__(self):
return iter(self.elements.values())
def __repr__(self):
return '{' + ', '.join(map(repr, self)) + '}'
# test
l0 = [
'GG_ooo', 'A_B Cdef', 'A_B Cdef', 'A_B Cdef',
'A_B CdEF', 'A_B CDEF', 'a_B CdEF', 'A_b CDEF', 'a1-23456',
]
l1 = CasefoldSet(l0[:4])
print(l1)
l1 |= l0[4:]
print(l1)
l2 = {'a', 'b', 'A_B Cdef'} | l1
print(l2)
l3 = l2 & {'a', 'GG_ooo', 'a_B CdEF'}
print(l3)
输出
{'GG_ooo', 'A_B Cdef'}
{'GG_ooo', 'A_B Cdef', 'a1-23456'}
{'GG_ooo', 'A_B Cdef', 'a1-23456', 'b', 'a'}
{'a_B CdEF', 'a', 'GG_ooo'}
这个类从collections.abc.MutableSet 继承了各种有用的方法,但是要完全替代set,它确实需要更多的方法。请注意,如果您尝试将非字符串项目传递给它,它将引发AttributeError。