首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不区分大小写的字典搜索?

不区分大小写的字典搜索?
EN

Stack Overflow用户
提问于 2010-07-21 13:23:19
回答 6查看 76.8K关注 0票数 40

我可以使用map在Python中实现不区分大小写的列表搜索。

代码语言:javascript
复制
a = ['xyz', 'wMa', 'Pma'];

b = map(string.lower, a)
if 'Xyz'.lower() in b:
    print 'yes'

我怎样才能对字典做同样的事情?

我尝试了以下代码,但ap有'a','b','c‘的列表,而不是不区分大小写的字典。

代码语言:javascript
复制
a = {'a':1, 'B':2, 'c':3}
ap = map(string.lower, a)
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-21 14:29:50

请注意,让字典不区分大小写,无论如何都可能丢失信息:例如,如何“不区分大小写”{'a': 23, 'A': 45}?!如果你所关心的是一个键在字典中的位置(也就是说,不关心它对应的值是什么),那么做一个set --也就是

代码语言:javascript
复制
theset = set(k.lower() for k in thedict)

(在每个版本的Python中,如果您对您的代码只能在Python2.7或更高版本中运行感到满意,因为纯粹的装饰性语法糖;-),请使用if k.lower() in theset: ...进行检查。

或者,您可以创建一个包装类,例如,可能是一个只读类:

代码语言:javascript
复制
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 )。

票数 50
EN

Stack Overflow用户

发布于 2010-07-21 13:57:56

使用字典理解(Python2.7+)

代码语言:javascript
复制
a_lower = {k.lower():v for k,v in a.items()}

如果您的python太老,无法进行dict理解

代码语言:javascript
复制
a_lower = dict((k.lower(),v) for k,v in a.items())

然后使用键的小写版本查找该值

代码语言:javascript
复制
value = a_lower[key.lower()]
票数 26
EN

Stack Overflow用户

发布于 2015-01-12 01:30:53

通过以下方式开始使用真实的不区分大小写的字典:

代码语言:javascript
复制
from requests.structures import CaseInsensitiveDict

或者,如果您想要查看代码:

代码语言:javascript
复制
class CaseInsensitiveDict(dict):

    """Basic case insensitive dict with strings only keys."""

    proxy = {}

    def __init__(self, data):
        self.proxy = dict((k.lower(), k) for k in data)
        for k in data:
            self[k] = data[k]

    def __contains__(self, k):
        return k.lower() in self.proxy

    def __delitem__(self, k):
        key = self.proxy[k.lower()]
        super(CaseInsensitiveDict, self).__delitem__(key)
        del self.proxy[k.lower()]

    def __getitem__(self, k):
        key = self.proxy[k.lower()]
        return super(CaseInsensitiveDict, self).__getitem__(key)

    def get(self, k, default=None):
        return self[k] if k in self else default

    def __setitem__(self, k, v):
        super(CaseInsensitiveDict, self).__setitem__(k, v)
        self.proxy[k.lower()] = k
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3296499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档