(permutation / Anagrm)单词在python 2.72中查找(需要帮助才能找到我的代码有什么问题)

时间:2011-11-26 08:08:23

标签: python word permutation anagram

我希望这个请求是合法的。 我正在为工程师学习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

任何人都知道如何解决它?

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您使用listify_string功能并使用该功能设置s1_lists2_list,则可能更容易看到代码中有多处出现问题,除非您打算从同一个字符串填充s1_list和s2_list。

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

然后,您只需执行s1_list = listify(string1)s2_list = ...即可设置值。

我可能至少将'检查两个列表是否相同'变成一个函数,所以我可以使用早期返回来表示错误(所以不要以booli为真,而是设置它在循环的每次迭代中,如果为false,则断开循环。

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

答案 2 :(得分:0)

尝试使用这种单行代码:

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

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