(permutation/Anagrm) 在 python 2.72 中找到的单词(需要帮助来找出我的代码有啥问题)
Posted
技术标签:
【中文标题】(permutation/Anagrm) 在 python 2.72 中找到的单词(需要帮助来找出我的代码有啥问题)【英文标题】:(permutation/Anagrm) words find in python 2.72 (need help to find what's wrong with my code)(permutation/Anagrm) 在 python 2.72 中找到的单词(需要帮助来找出我的代码有什么问题) 【发布时间】: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)
【参考方案1】:
您的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
【讨论】:
第三个“段落”的第二行。可能还应该引用 string2 而不是 string1。 天哪,我真的应该在下一次验光师访问之前......谢谢,你帮了大忙。 您可能希望将.replace(' ', '')
步骤添加到简短的解决方案中......虽然实际上,我们应该按照通常的规则删除所有标点符号。【参考方案2】:
如果您创建一个 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
开头为真,而是将其设置在每个遍历循环,如果为 false 则退出循环)。
如果您查看 Python 字符串的 join
方法,您可能会发现另一种方法来检查 s1_list 和 s2_list 是否相同。
【讨论】:
或者只使用内置的list
:list(string1)
【参考方案3】:
试试这个单线:
sorted(s1.lower().replace(' ', '')) == sorted(s2.lower().replace(' ', ''))
Python 字符串本质上是列表,因此可以对其进行排序。我们只需要先处理大写和空格。然后 python 的 equals 运算符负责实际的比较。
【讨论】:
以上是关于(permutation/Anagrm) 在 python 2.72 中找到的单词(需要帮助来找出我的代码有啥问题)的主要内容,如果未能解决你的问题,请参考以下文章