【问题标题】:Python basics: check if object is in set of stringsPython基础:检查对象是否在字符串集中
【发布时间】:2018-08-30 18:17:13
【问题描述】:

如果我有课

class Kid():
  def __init(name):
    self.name = name

我应该添加什么才能做到这一点:

def is_cool(kid):
  cool_kids = {"Jim","Bill","Nebuchadnezzar II"}
  return kid in cool_kids

我必须从 str 继承 Kid 吗?

添加 1:我知道我可以写 return kid.name in cool_kids,但我正在为我的代码寻找一点语法糖。我想要一种在一组非常不同的对象中检查 obj 的方法。

【问题讨论】:

  • syntax sugar 是什么意思?返回kid.name in cool_kids 是迄今为止最简单的解决方案。
  • 因为我简化了我的问题。我的实际 Kid 没有成员 name 或函数 name(),我可以将 Kid 与 str 进行比较,但我无法生成名称,因为比较需要正则表达式。
  • 您能否添加一个更复杂的示例,以便更好地了解您的上下文和您的问题?

标签: python oop


【解决方案1】:

这个怎么样:

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

您需要同时覆盖 __eq____hash__,因为两者都需要从元素中满足才能成为哈希表的成员。当 Python 评估一个元素是否是哈希表的成员时,它首先查看哈希是否匹配,如果匹配,则查看是否相等。对于此示例,不需要覆盖 __ne__,但这样做是一个很好的做法,您不希望 equals 和 not equals 不同步。

【讨论】:

  • 是的。这就是解决我的简化示例的方法。不幸的是,在实际情况下,我无法提供有意义的hash,因为孩子的名字不需要完全匹配。所以这是不可能的。没有它我也能活下去,我只想在代码中少一些显式循环。
  • @BarafuAlbino,我不认为你可以用hash 做你想要的事情,你可以用__eq__ 做类似的事情,然后遍历你的一组元素并比较每个kid 实例。但是,这将使您的 is_cool 函数 O(n) 而不是 O(1),就像现在一样。
【解决方案2】:

你可以这样做:

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")))

输出

False
True

您的代码有一些问题,您需要从Kid 类定义中删除括号并将方法__init 更改为__init__,将self 作为第一个参数传递。

更新

如果你想从 str 继承,你可以这样做:

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

您可以找到更多关于从 str here 继承的信息

【讨论】:

    【解决方案3】:

    我怀疑以下内容会如你所愿:

    def is_cool(kid):
      cool_kids = {"Jim","Bill","Nebuchadnezzar II"}
      return kid.name in cool_kids
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2017-01-09
      • 2022-01-03
      • 1970-01-01
      • 2015-07-07
      相关资源
      最近更新 更多