这个问题已经在这里有了答案 :
不区分大小写的字典 (10个答案)
2年前关闭。
我可以使用map使用Python实现不区分大小写的列表搜索。
a = ['xyz', 'wMa', 'Pma'];
b = map(string.lower, a)
if 'Xyz'.lower() in b:
print 'yes'
我如何用字典做同样的事情?
我尝试了以下代码,但是ap具有[‘a’,’b’,’c’]的列表,而不区分大小写的字典。
a = {'a':1, 'B':2, 'c':3}
ap = map(string.lower, a)
注意,使字典不区分大小写,无论如何意味着都可能会丢失信息:例如,您将如何“不区分大小写” {'a': 23, 'A': 45}
?如果您关心的只是某个键在字典中的位置(即,不在乎与之对应的值),请set
改用一个替代方法-即
theset = set(k.lower() for k in thedict)
(在Python的每个版本中,或者{k.lower() for k in thedict}
由于某些纯粹的装饰性语法糖,如果您对仅在python
2.7或更高版本中工作的代码感到满意;-),并使用进行检查if k.lower() in theset: ...
。
或者,您可以创建一个包装器类,例如,一个只读类…:
import collections
class CaseInsensitiveDict(collections.Mapping):
def __init__(self, d):
self._d = d
self._s = dict((k.lower(), k) for k in d)
def __contains__(self, k):
return k.lower() in self._s
def __len__(self):
return len(self._s)
def __iter__(self):
return iter(self._s)
def __getitem__(self, k):
return self._d[self._s[k.lower()]]
def actual_key_case(self, k):
return self._s.get(k.lower())
这将保持(无需实际更改原始字典,因此,如果需要的话,仍然可以为它检索所有精确信息)任意可能的多个键值中的任意一个,由于情况“折叠”为单个键,不敏感,并提供字典的所有只读方法(仅带字符串键),以及actual_key_case
返回用于任何给定字符串键的实际大小写混合的方法(或者None
如果该给定字符串键的大小写更改不匹配字典中的任何键)
)。