【发布时间】:2012-01-06 19:24:02
【问题描述】:
我希望这个请求是合法的。 我正在为工程师参加 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
有人知道怎么解决吗?
谢谢!
【问题讨论】:
-
@Vatine,编辑问题以提供答案(在代码注释中)是糟糕的形式。这让人误以为提问者错过了已经明确向他解释过的东西,这是不公平的。
-
整个函数体可以替换成
return sorted(string1.lower().replace(' ', '')) == sorted(string2.lower().replace(' ', ''))。没有必要让事情变得像你一样复杂。字符串不能就地排序,因为它们是不可变的,但sorted()函数将接受不可变序列,因为它会创建一个新值。此外,Python 已经知道如何逐元素比较序列。 -
另外,不需要这样的卷积将列表转换为字符串。就做
s1_list = list(string1)
标签: python word permutation anagram