Python基础知识:检查对象是否在字符串集中
如果我有课Python基础知识:检查对象是否在字符串集中,python,oop,Python,Oop,如果我有课 class Kid(): def __init(name): self.name = name 我应该添加什么才能做到这一点: def is_cool(kid): cool_kids = {"Jim","Bill","Nebuchadnezzar II"} return kid in cool_kids 我必须从str继承孩子吗 添加1:我知道我可以在cool_kids中编写return kid.name,但我正在为我的代码寻找一点语法糖。我想要一种在一组非常
class Kid():
def __init(name):
self.name = name
我应该添加什么才能做到这一点:
def is_cool(kid):
cool_kids = {"Jim","Bill","Nebuchadnezzar II"}
return kid in cool_kids
我必须从str继承孩子吗
添加1:我知道我可以在cool_kids中编写
return kid.name,但我正在为我的代码寻找一点语法糖。我想要一种在一组非常不同的对象中检查obj的方法 您可以这样做:
class Kid:
def __init__(self, name):
self.name = name
def is_cool(kid):
cool_kids = {"Jim", "Bill", "Nebuchadnezzar II"}
return kid.name in cool_kids
print(is_cool(Kid("Daniel")))
print(is_cool(Kid("Jim")))
class Kid(str):
def __new__(cls, *args, **kw):
return str.__new__(cls, *args, **kw)
def is_cool(kid):
cool_kids = {"Jim", "Bill", "Nebuchadnezzar II"}
return kid in cool_kids
print(is_cool(Kid("Daniel")))
print(is_cool(Kid("Jim")))
输出
False
True
False
True
您的代码有一些问题,您需要从Kid
类定义中删除括号,并将方法\uuu init
更改为\uuu init\uu
作为第一个参数传递self
更新
如果要从str继承,可以这样做:
class Kid:
def __init__(self, name):
self.name = name
def is_cool(kid):
cool_kids = {"Jim", "Bill", "Nebuchadnezzar II"}
return kid.name in cool_kids
print(is_cool(Kid("Daniel")))
print(is_cool(Kid("Jim")))
class Kid(str):
def __new__(cls, *args, **kw):
return str.__new__(cls, *args, **kw)
def is_cool(kid):
cool_kids = {"Jim", "Bill", "Nebuchadnezzar II"}
return kid in cool_kids
print(is_cool(Kid("Daniel")))
print(is_cool(Kid("Jim")))
输出
False
True
False
True
您可以找到有关从str继承的更多信息我怀疑以下内容可以满足您的要求:
def is_cool(kid):
cool_kids = {"Jim","Bill","Nebuchadnezzar II"}
return kid.name in cool_kids
这个怎么样:
class Kid():
def __init__(self, name):
self.name = name
def __eq__(self, other):
return self.name == other
def __ne__(self, other):
return not self.name == other
def __hash__(self):
return hash(self.name)
def is_cool(kid):
cool_kids = {"Jim","Bill","Nebuchadnezzar II"}
return kid in cool_kids
if __name__ == "__main__":
print is_cool(Kid("Bob"))
print is_cool(Kid("Jim"))
print is_cool(Kid("Bill"))
结果:
False
True
True
您需要重写\uuuuuueq\uuuu
和\uuuuhash\uuuuuu
,因为要成为哈希表的成员,元素需要满足这两个条件。当Python计算元素是否为哈希表的成员时,它首先查看哈希是否匹配,如果匹配,则查看相等性。在本例中,重写\uuu ne\uuuu
不是必需的,但这样做是一种很好的做法,您不希望equals和not equals不同步。您的意思是语法糖
?在cool_kids
中返回kid.name是迄今为止最简单的解决方案。由于我简化了我的问题,可能会重复。我的实际孩子没有成员name
或函数name()
,我可以将孩子与str进行比较,但我无法生成名字,因为比较需要regexp杂耍。为了更好地了解您的上下文和问题,您能添加更复杂的示例吗?是的。这就是解决我的简化示例的原因。不幸的是,在实际情况中,我不能提供有意义的哈希值
,因为孩子们的名字不一定要精确匹配。所以这是不可能的。我可以没有它,我只想在代码中有不那么显式的循环。@BarafuAlbino,我不认为你可以用哈希
做你想要做的事情,你可以用\uuuuueq\uuuu
做类似的事情,然后在你的元素集上迭代,并将每个元素与kid
实例进行比较。然而,这将使你的功能O(n)变得很酷,而不是像现在这样的O(1)。