0

我希望这个要求是合法的。我正在为工程师参加 Python 编程课程,所以我对这个行业有点陌生。无论如何,在我的作业中,我被要求编写一个接收两个字符串的函数,并检查一个是否是另一个的(排列/Anagrm)。(这意味着如果它们都具有完全相同的字母并且每个字母的出现次数相同)

我在搜索时在这里找到了一些很棒的代码,但我仍然不明白我的代码有什么问题(而且了解我的学习过程对我来说很重要)。

我们有一个测试文件,它假设检查我们的功能,它给了我这个错误:

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

谁知道怎么修它 ?

谢谢!

4

3 回答 3

5

看起来你有一个错字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
于 2011-11-26T08:15:59.230 回答
0

试试这个单线:

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

Python 字符串本质上是列表,因此可以对其进行排序。我们只需要先处理大写和空格。然后python equals 运算符负责实际比较。

于 2011-11-26T09:27:55.817 回答
0

如果您创建一个listify_string函数并使用它来设置您的s1_listand s2_list,则可能更容易看出您的代码有多个看起来有问题的地方,除非您打算从同一个字符串中填充 s1_list 和 s2_list 。

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

然后你可以简单地做s1_list = listify(string1)s2_list = ...设置值。

我可能至少会将“检查两个列表是否相同”转换为一个函数,因此我可以使用早期返回来指示错误(因此,不是从boolitrue 开始,而是在循环的每次迭代中设置它并中断如果为假,则退出循环)。

如果您查看joinPython 字符串的方法,您可能会找到另一种检查 s1_list 和 s2_list 是否相同的方法的灵感。

于 2011-11-26T08:31:03.540 回答