Анаграмма Python 3 [закрыта]

Я пытаюсь написать программу, которая проверяет, являются ли 2 входа анаграммами. Я чувствую, что это должно быть относительно легко, но я не могу понять это. Я должен определить функцию как:

def isAnagram(s1, s2):

пока у меня так:

word1 = input("Enter a string: ")
word2 = input("Enter a second string: ")

def isAnagram(s1, s2):
    s1 = word1.sort()
    s2 = word2.sort()
    if s1 == s2:
       print("This is an anagram")
    else:
       print("This is not an anagram)
isAnagram()

Думаю, я не совсем понимаю определение функций, поэтому, если бы вы могли объяснить, что происходит, это было бы здорово!


person Whoo Cares    schedule 13.11.2013    source источник
comment
1. Думаю, вам нужно погуглить определение анаграммы. 2. Это миллионный вопрос о программе анаграммы в Python, и я уверен, что вы найдете более чем достаточно подсказок. 3. SO предназначен для конкретных вопросов, а не для исправления моего кода.   -  person sashkello    schedule 13.11.2013
comment
4. Вы никогда не принимали ответы на свои вопросы. Это заставляет людей еще более неохотно отвечать. Если вы нашли то, что искали, примите ответ и/или проголосуйте за другие полезные ответы.   -  person sashkello    schedule 13.11.2013
comment
@sashkello: Кажется, он прекрасно понимает анаграммы. Его алгоритм верен и даже достаточно эффективен. Он просто не понимает некоторых базовых вещей Python.   -  person abarnert    schedule 13.11.2013
comment
@abarnert Да, теперь я это вижу, сначала неправильно прочитал код. Однако базовые навыки поиска пригодятся, вот что я нашел за 20 секунд: title="проверка строк относительно анаграмм друг друга"> stackoverflow.com/questions/14990725/   -  person sashkello    schedule 13.11.2013
comment
Спасибо всем. @sashkello ты прав, я еще немного погуглил и нашел еще кое-что. Думаю, я просто расстроился, что не мог этого понять.   -  person Whoo Cares    schedule 13.11.2013
comment
Самая основная идея решения анаграммы состоит в том, чтобы отсортировать обе строки, а не приравнять их. Если они равны, то это анаграмма, иначе нет. Простую реализацию Python можно найти на jee-appy.blogspot.com. /2016/06/python-anagram-program.html   -  person Ajeet Khan    schedule 27.06.2016


Ответы (3)


Вы определили функцию почти правильно, но есть несколько проблем.

Сначала вы запрашиваете s1 и s2 в качестве параметров. Это хорошо. Теперь используйте эти значения, а не глобальные переменные word1 и word2.

Во-вторых, если эти значения являются строками, вы не можете вызвать для них sort, потому что у строк нет метода sort. Но вы можете вызывать функцию sorted для любой последовательности, даже для строк.

В-третьих, есть простая опечатка, отсутствие " во втором print.

Возможно, было бы лучше вернуть значение True или False и поместить print вне функции, но пока оставим это.

Собрав это вместе, вот рабочая функция:

def isAnagram(s1, s2):
    s1 = sorted(s1)
    s2 = sorted(s2)
    if s1 == s2:
       print("This is an anagram")
    else:
       print("This is not an anagram")

Но теперь вам также нужно правильно вызвать функцию. Вы определили функцию, которая принимает два параметра, s1 и s2. Это означает, что вам нужно вызвать функцию с двумя аргументами.

Так откуда у вас такие аргументы? Что ж, у вас уже есть эти переменные word1 и word2, и они кажутся именно тем, что вам нужно.

Итак, измените последнюю строку на:

isAnagram(word1, word2)

И вы сделали.

person abarnert    schedule 13.11.2013

Вы правильно поняли, но поскольку word1 и word2 являются строками, у них нет атрибута .sort(). Вы все еще можете сортировать буквы в этой строке:

>>> w='hello'
>>> sorted(w)
['e', 'h', 'l', 'l', 'o']

Результатом sorted() является список, мы можем превратить его обратно в строку, объединив их с помощью пустой строки:

>>> ''.join(sorted(w))
'ehllo'

Вооружившись этими знаниями, ваша программа может выглядеть примерно так:

word1 = input("Enter a string: ")
word2 = input("Enter a second string: ")

def isAnagram(s1, s2):
    s1 = ''.join(sorted(word1))
    s2 = ''.join(sorted(word2))
    if s1 == s2:
       print("This is an anagram")
    else:
       print("This is not an anagram")

isAnagram(word1, word2)
person Hai Vu    schedule 13.11.2013

Ваш подход к поиску анаграмм вполне разумен. Сортировка слов и их сравнение — самый простой способ определить, являются ли два слова анаграммами друг друга.

Однако я думаю, что вас смущает идея параметров функции. Когда вы определяете

foo(x1, x2)

когда вызывается foo, ожидается, что он будет вызван с двумя параметрами. Вы определяете

anagram(s1, s2)

но никогда не снабжайте его s1 и s2. Список параметров — это не список имен переменных, которые вы используете в функции — вы можете назначать новые переменные по желанию. Вместо этого это список входных данных, которые принимает функция.

поэтому anagram() неверно. Вам нужно позвонить anagram(input1, input2). (Предполагая, что у вас нет значений по умолчанию, в которые я не буду вдаваться.

def isAnagram(s1, s2):
    sortedWord1 = sorted(s1) # s1 is word1! (sorted instead of sort, strings are immutable)
    #what should you do here?
    if sortedWord1 == sortedWord2:
       print("This is an anagram")
    else:
       print("This is not an anagram") # you forgot a closing quote!

word1 = input("Enter a string: ")
word2 = input("Enter a second string: ")

isAnagram(word1, word2)

Я немного изменил ваш код, чтобы он работал правильно. Тем не менее, я рекомендую вам немного больше прочитать о функциях, прежде чем продолжить.

Думайте о них так же, как о функциях в математике! f(x) имеет смысл, f, хотя и имеет смысл, вероятно, не то, что вы искали.

>>> isAnagram("anagram", "nagaram")
This is an an anagram
>>> isAnagram("anagram", "woohoo")
This is not an anagram
>>> isAnagram("a", "a")
This is an an anagram
person vroomfondel    schedule 13.11.2013