Как мне создать класс (ООП), который сравнивает два слова, чтобы быть одинаковыми, даже если они анаграммы - PullRequest
0 голосов
/ 18 июня 2019

Попытка создать ООП с использованием класса для сравнения двух слов и возврата True, если они одинаковы, и false, если нет. Слова могут быть версиями анаграмм / прописными / строчными буквами друг друга и при этом оставаться верными (W1 = sTop, W2 = Pots, W1 == W2 result: True) Я новичок в кодировании, поэтому я борюсь за атрибутную часть этого код. Как мне заставить его прочитать слово как то же самое в этих условиях.

Я просмотрел этот сайт, а также другие, чтобы найти структуру и общую идею ООП, и собрал воедино то, что я считаю правильным, однако я знаю, что он не завершен и выдает ошибки, когда запускаю его. Я попытался вызвать методы в str, используя область видимости моего класса, и это не удалось, что я и ожидал. Любая помощь в объяснении / написании этой проблемы была бы отличной. Пожалуйста, извините мои начинающие способности в кодировании.

Слово класса:

def _init_(self, word):
    self.word = word


def _str_(self):
    w1 == w2
    return self.lower(word)


Expected outcomes:

Examples
word1 = Word("post")
word2 = Word("stop")
word1 == word2

Result: True
word1 = Word("")
word2 = Word("")
word1 == word2

Result: True
word1 = Word("aBlE")
str(word1)

Result: able
word1 = Word("able")
word2 = Word("baker")
word1 == word2

Result: False
word1 = Word("Hi there! :-)")
word2 = Word("Hit here! :-)")
word1 == word2

Result: True

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Анаграммы - это слова, содержащие одинаковые буквы и одинаковые цифры.Вы можете написать функцию, которая принимает два слова, сортирует буквы и сравнивает их одно за другим.

def are_anagrams(word1, word2):
    return sorted(word1.lower()) == sorted(word2.lower())

are_anagrams('abBa', 'BAba'), are_anagrams('abby', 'baba')

Если вы хотите использовать класс, вы можете переопределить метод __eq__ dunder, который управляетповедение оператора ==:

Может быть что-то вроде этого:

class AnagramWords:
    def __init__(self, word):
        self.word = word
        self.cmp = sorted(self.word.lower())
    def __eq__(self, other):
        """returns True if self is an anagram of other
        """
        if isinstance(other, str):
            other = AnagramWords(other)
        if isinstance(other, type(self)):
            return self.cmp == other.cmp
        raise NotImplementedError(f'AnagramWord cannot compare to {type(other)}')


def are_anagrams(word1, word2):
    return sorted(list(word1.lower())) == sorted(list(word2.lower()))

are_anagrams('abBa', 'BAba'), are_anagrams('abby', 'baba')  # True, False

w1 = AnagramWords('AbBA')
w2 = AnagramWords('BBaa')
w3 = AnagramWords('bABy')
print(w1 == w2, w2 == w3)   # True, False

print(w3 == 123)   # NotImplementedError: AnagramWord cannot compare to <class 'int'>
1 голос
/ 19 июня 2019
  • Прежде всего, методы dunder (двойное подчеркивание: '__') - это специальные методы, используемые вами или python для подключения к вашему коду, например, реализация __len__ в классе позволит вам запуститьlen(MyClass) вместо MyClass.__len__().в сущности, ваше определение __str__ не является вашим желаемым шагом.
  • Во-вторых, в вашем __str__ методе вы пытаетесь сравнить w1 == w2, то есть две переменные, которых у вас нетопределены или приняты в качестве аргументов вашей функции.

Мой ответ таков: не всегда вам нужно использовать ООП, например, ваш случай может быть определен как простая функция следующим образом

edit

Как я вижу, я случайно перепутал анаграмму с палиндромом , я также добавляю версию анаграммы.

def is_anagram(w1, w2):
    return sorted(w1.lower()) == sorted(w2.lower())

# and I am keeping just for reference sake the palindrome one.
def is_palindrome(w1, w2):
    return w1.lower() == w2.lower()[::-1]

То, что я делаю в функции анаграммы - это первое, я пишу слова в нижнем регистре, чтобы я мог сравнивать символы независимо от регистра, а затем я использую функцию sorted, которая принимает последовательность (которая str является последовательностью) и сортирует ее), а затем мы сравниваем 2, чтобы увидеть, действительно ли они являются анаграммами друг друга.

То, что я делаю в функции палиндром, принимаетстроки, а затем сравнивая версию в нижнем регистреn от w1 до уважаемой строчной версии w2, я переворачиваю строку, используя срез, который начинается с индекса по умолчанию (неявный, поскольку он пуст до первого двоеточия), остановка по умолчанию и шаг отрицания1, что в действительности переворачивает строку.

В любом случае, я желаю вам большой удачи в вашем программировании!

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