(перестановка / Anagrm) слова найти в Python 2.72 (нужна помощь, чтобы найти, что не так с моим кодом) - PullRequest
0 голосов
/ 26 ноября 2011

Я надеюсь, что этот запрос является законным. Я беру курс программирования на python для инженеров, так что я немного новичок в этом бизнесе. во всяком случае, в моей домашней работе меня попросили написать функцию с получением двух строк и проверить, является ли одна (перестановка / анагрма) другой. (что означает, что они оба имеют одинаковые буквы и одинаковое количество появлений для каждой буквы)

Я нашел здесь несколько хороших кодов при поиске, но я до сих пор не понимаю, что не так с моим кодом (и мне важно знать о процессе обучения).

мы получили тестовый файл, который должен проверить наши функции, и он выдал мне эту ошибку:

Traceback (most recent call last):
File "C:\Users\Or\Desktop\תכנות\4\hw4\123456789_a4.py", line 110, in <module>
test_hw4()
File "C:\Users\Or\Desktop\תכנות\4\hw4\123456789_a4.py", line 97, in test_hw4
test(is_anagram('Tom Marvolo Riddle','I Am Lord Voldemort'), True)
File "C:\Users\Or\Desktop\תכנות\4\hw4\123456789_a4.py", line 31, in is_anagram
s2_list.sort()
NameError: global name 's2_list' is not defined

это мой код:

def is_anagram(string1, string2):    

    string1 = string1.lower() #turns Capital letter to small ones
    string2 = string2.lower()
    string1 = string1.replace(" ","") #turns the words inside the string to one word
    string2 = string2.replace(" ","")

    if len(string1)!= len(string2):
        return False

    s1_list = [string1[i] for i in range(len(string1))] #creates a list of string 1 letters
    a2_list = [string1[k] for k in range(len(string1))]
    s1_list.sort()  #sorting the list
    s2_list.sort()
    booli=False
    k=0

    for i in s1_list: #for loop which compares each letter in the two lists
        if s1_list[k]==s2_list[k]:
            booli = True
            k=k+1
        else:
            booli=False
            break

    return booli

Кто-нибудь знает, как это исправить?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 26 ноября 2011

Похоже, у вас есть опечатка с a2_list.Этот раздел должен выглядеть следующим образом:

s1_list = [string1[i] for i in range(len(string1))] #creates a list of string 1 letters
s2_list = [string2[k] for k in range(len(string2))]
s1_list.sort()  #sorting the list
s2_list.sort()

FWIW, вот пример интерактивной подсказки о том, как определить, являются ли две строки анаграммами друг друга:

>>> string1 = 'Logarithm'
>>> string2 = 'algorithm'
>>> sorted(string1.lower()) == sorted(string2.lower()) # see if they are anagrams
True
0 голосов
/ 26 ноября 2011

Попробуйте вместо этого одну строку:

sorted(s1.lower().replace(' ', '')) == sorted(s2.lower().replace(' ', ''))

Строки Python по сути являются списками, поэтому их можно сортировать. Нам просто нужно сначала позаботиться о прописных и пробельных символах. Затем оператор равенства python заботится о реальном сравнении.

0 голосов
/ 26 ноября 2011

Если вы сделаете функцию listify_string и будете использовать ее для установки s1_list и s2_list, может быть легче увидеть, что в вашем коде есть несколько вещей, которые выглядят не так, если вы не предполагали оба s1_list и s2_list для заполнения из одной строки.

def listify(string):
    return [c for c in string]

Тогда вы можете просто сделать s1_list = listify(string1) и s2_list = ..., чтобы установить значения.

Возможно, я бы, по крайней мере, включил «проверку, если два списка одинаковы», в функцию, поэтому я мог бы использовать ранний возврат, чтобы указать на ложность (поэтому вместо того, чтобы начинать с booli как true, устанавливая его на каждом итерация по циклу и выход из цикла, если false).

Если вы посмотрите на метод join строк Python, вы можете найти другой способ проверить, совпадают ли s1_list и s2_list.

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