当前位置: 首页 > 面试题库 >

不区分大小写的字典搜索?[重复]

祖利
2023-03-14
问题内容

这个问题已经在这里有了答案

不区分大小写的字典 (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如果该给定字符串键的大小写更改不匹配字典中的任何键)
)。



 类似资料: