Основы Python: проверьте, находится ли объект во множестве строк - PullRequest
0 голосов
/ 30 августа 2018

Если у меня есть класс

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

что я должен добавить к этому, чтобы иметь возможность сделать это:

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

Должен ли я наследовать Малыша от ул?

ADD 1: я знаю, что могу написать return kid.name in cool_kids, но я ищу немного синтаксического сахара для своего кода. Я хочу, чтобы проверить obj в множестве самых разных объектов.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Я подозреваю, что следующее будет делать то, что вы хотите:

def is_cool(kid):
  cool_kids = {"Jim","Bill","Nebuchadnezzar II"}
  return kid.name in cool_kids
0 голосов
/ 30 августа 2018

Как насчет этого:

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__ не обязательно для этого примера, но это хорошая практика, вы не хотите, чтобы равные и не равные были не синхронизированы.

0 голосов
/ 30 августа 2018

Вы можете сделать это так:

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 в качестве первого параметра.

UPDATE

Если вы хотите наследовать от 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 можно узнать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...