风流倜傥的大蒜 · Perl中对字符串的大小写转换-CSDN博客· 3 天前 · |
活泼的冲锋衣 · ClickHouse ...· 16 小时前 · |
高大的小虾米 · SPARK-SQL内置函数之时间日期类-CS ...· 1 年前 · |
没读研的米饭 · scipy.io.wavfile.read, ...· 1 年前 · |
乖乖的土豆 · LLVM 后端实践笔记 6:更多数据类型 - 知乎· 1 年前 · |
狂野的日光灯 · vba textbox回车触发事件-掘金· 1 年前 · |
精明的钥匙扣 · python - No module ...· 1 年前 · |
我可以使用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)
dict(zip(map(string.lower,a.keys()),a.values()))
会做你想做的事。
map(function,iterable)在iterable上工作;而字典的iterable是键的列表。
a = {'a': 1, 'c': 3, 'B': 2}
for i in a:
print a
# returns a c B
zip将键和值重新组合成对,但作为一系列元组。dict将元组转换回dict。
你也可以像这样做
def myfunc(t):
return (string.lower(t[0]),t[1])
map(myfunc,a.items())
# returns [('a', 1), ('c', 3), ('b', 2)
dict(map(myfunc,a.items()))
# returns {'a': 1, 'c': 3, 'b': 2}
或者,更有趣的是...
dict(map(lambda (key, value):(string.lower(key),value),a.items()))
使用字典理解(Python2.7+)
a_lower = {k.lower():v for k,v in a.items()}
如果您的python太老,无法进行dict理解
a_lower = dict((k.lower(),v) for k,v in a.items())
然后使用键的小写版本查找该值
value = a_lower[key.lower()]
请注意,让字典不区分大小写,无论如何都可能丢失信息:例如,如何“不区分大小写”
{'a': 23, 'A': 45}
?!如果你所关心的是一个键在字典中的位置(也就是说,不关心它对应的值是什么),那么做一个
set
--也就是
theset = set(k.lower() for k in thedict)
(在每个版本的Python中,如果您对您的代码只能在Python2.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
)。
如果您不经常需要查找,则可以使用此功能,而不会浪费空间用于字典的其他副本。虽然它很慢,因为每次都必须检查所有的键。
a = {'xyz':2, 'wMa':8, 'Pma':9}
## if you do not use many times and/or the dict is very big
def case_insensitive_key(a,k):
k = k.lower()
return [a[key] for key in a if key.lower() == k]
print 'yes' if case_insensitive_key(a,'Xyz') else 'no'
我只想给Alex Martelli的答案加上__setitem__,pop:
from collections import Mapping
class CaseInsensitiveDict(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 __setitem__(self, k, v):
self._d[k] = v
self._s[k.lower()] = k
def pop(self, k):
k0 = self._s.pop(k.lower())
return self._d.pop(k0)
def actual_key_case(self, k):
return self._s.get(k.lower())
通过以下方式开始使用真实的不区分大小写的字典:
from requests.structures import CaseInsensitiveDict
或者,如果您想要查看代码:
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)
风流倜傥的大蒜 · Perl中对字符串的大小写转换-CSDN博客 3 天前 |
高大的小虾米 · SPARK-SQL内置函数之时间日期类-CSDN博客 1 年前 |
乖乖的土豆 · LLVM 后端实践笔记 6:更多数据类型 - 知乎 1 年前 |
狂野的日光灯 · vba textbox回车触发事件-掘金 1 年前 |