gpt4 book ai didi

python - python中不区分大小写的字符串类

转载 作者:行者123 更新时间:2023-12-01 03:08:20 24 4
gpt4 key购买 nike

我需要在 python 中的集合和字典键中执行不区分大小写的字符串比较。现在,创建不区分大小写的集合和 dict 子类被证明是非常棘手的(请参阅: Case insensitive dictionary 的想法,注意它们都使用 lower - 嘿,甚至有一个被拒绝的 PEP ,尽管它的范围更广泛)。因此,我创建了一个不区分大小写的字符串类(利用 @AlexMartelli 的 answer):

class CIstr(unicode):
"""Case insensitive with respect to hashes and comparisons string class"""

#--Hash/Compare
def __hash__(self):
return hash(self.lower())
def __eq__(self, other):
if isinstance(other, basestring):
return self.lower() == other.lower()
return NotImplemented
def __ne__(self, other): return not (self == other)
def __lt__(self, other):
if isinstance(other, basestring):
return self.lower() < other.lower()
return NotImplemented
def __ge__(self, other): return not (self < other)
def __gt__(self, other):
if isinstance(other, basestring):
return self.lower() > other.lower()
return NotImplemented
def __le__(self, other): return not (self > other)

我完全知道较低not really enough涵盖 unicode 中字符串比较的所有情况,但我正在重构现有代码,该代码使用了一个更笨重的类进行字符串比较(内存和速度方面),无论如何使用 lower() - 所以我可以在稍后阶段修改它 - 而且我是在 python 2 上(如 unicode 所示)。我的问题是:

  • 我的操作符正确吗?

  • 这个类足以满足我的目的,因为我小心地在字典中构造键并将元素设置为 CIstr 实例 - 我的目的是检查相等性、包含性、设置差异和类似的以不区分大小写的方式进行操作。或者我错过了什么?

  • 是否值得缓存字符串的小写版本(例如在这个古老的Python配方中看到的: Case Insensitive Strings )。这个comment建议不是 - 而且我希望施工速度尽可能快,尺寸尽可能小,但人们似乎也包括这一点。

Python 3 兼容性提示值得赞赏!

小演示:

d = {CIstr('A'): 1, CIstr('B'): 2}
print 'a' in d # True
s = set(d)
print {'a'} - s # set([])

最佳答案

在您的演示中,您使用 'a' 来查找集合中的内容。如果您尝试使用'A',它将不起作用,因为'A'具有不同的哈希值。另外,'A' in d.keys() 将为 true,但 'A' in d 将为 false。通过声明与具有不同哈希值的对象相等,您实质上创建了一个违反所有哈希值正常约定的类型。

您可以将此答案与有关创建专用字典的答案结合起来,并在尝试查找之前将任何可能的键转换为 CIstr 的字典。然后,所有 CIstr 转换都可以隐藏在字典类中。

例如

class CaseInsensitiveDict(dict):
def __setitem__(self, key, value):
super(CaseInsensitiveDict, self).__setitem__(convert_to_cistr(key), value)
def __getitem__(self, key):
return super(CaseInsensitiveDict, self).__getitem__(convert_to_cistr(key))
# __init__, __contains__ etc.

(基于https://stackoverflow.com/a/2082169/3890632)

关于python - python中不区分大小写的字符串类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43122096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com