python中两个字符串的字谜测试
问题是: 编写一个名为test_的函数,用于接收两个字符串作为 参数,两者都由字母字符和返回组成 如果两个字符串是字谜,则为True,否则为False。两个字符串是 如果一个字符串可以通过重新排列 另一个字符串中的字符使用 原始字符串只显示一次。例如,弦乐“管弦乐队”和 “Carthorse”是字谜,因为每个字谜都可以由 使用所有字符重新排列另一个中的字符 在其中的一个里面,只有一次。请注意,资本化并不重要 此处,即小写字符可被视为与 大写字符 我的代码:python中两个字符串的字谜测试,python,python-3.x,Python,Python 3.x,问题是: 编写一个名为test_的函数,用于接收两个字符串作为 参数,两者都由字母字符和返回组成 如果两个字符串是字谜,则为True,否则为False。两个字符串是 如果一个字符串可以通过重新排列 另一个字符串中的字符使用 原始字符串只显示一次。例如,弦乐“管弦乐队”和 “Carthorse”是字谜,因为每个字谜都可以由 使用所有字符重新排列另一个中的字符 在其中的一个里面,只有一次。请注意,资本化并不重要 此处,即小写字符可被视为与 大写字符 我的代码: def test_for_anagra
def test_for_anagrams (str_1, str_2):
str_1 = str_1.lower()
str_2 = str_2.lower()
print(len(str_1), len(str_2))
count = 0
if (len(str_1) != len(str_2)):
return (False)
else:
for i in range(0, len(str_1)):
for j in range(0, len(str_2)):
if(str_1[i] == str_2[j]):
count += 1
if (count == len(str_1)):
return (True)
else:
return (False)
#Main Program
str_1 = input("Enter a string 1: ")
str_2 = input("Enter a string 2: ")
result = test_for_anagrams (str_1, str_2)
print (result)
这里的问题是,当我以
乐团
和马车
的形式输入字符串时,结果为假
。同样的字符串眼睛和他们看到的。任何帮助都将不胜感激。问题在于,您只需检查字符串中是否存在任何字符匹配,然后递增计数器。不考虑已与另一个匹配的字符。这就是为什么以下操作也会失败:
>>> test_for_anagrams('aa', 'aa')
False
即使字符串相等(同样也是一个字谜),您也将第一个字符串的每个a
与另一个字符串的每个a
相匹配,因此您有一个4
的计数,结果是False
通常,您应该计算每个字符的出现次数,并确保每个字符在每个字符串中出现的频率相同。可以使用对象来计算字符数。然后,您只需检查每个字符串的计数是否相同,这可以通过比较计数器对象(只是字典)轻松做到:
为了完整性:如果只是导入计数器并完成练习不符合练习的精神,您可以使用普通字典来计算字母
def test_for_anagrams(str_1, str_2):
counter1 = {}
for c in str_1.lower():
counter1[c] = counter1.get(c, 0) + 1
counter2 = {}
for c in str_2.lower():
counter2[c] = counter2.get(c, 0) + 1
# print statements so you can see what's going on,
# comment out/remove at will
print(counter1)
print(counter2)
return counter1 == counter2
演示:
输出:
{' ': 1, 'e': 3, 'h': 1, 's': 1, 't': 1, 'y': 1}
{' ': 1, 'e': 3, 'h': 1, 's': 1, 't': 1, 'y': 1}
True
{'a': 1, 'c': 1, 'e': 1, 'h': 1, 'o': 1, 's': 1, 'r': 2, 't': 1}
{'a': 1, 'c': 1, 'e': 1, 'h': 1, 'o': 1, 's': 1, 'r': 2, 't': 1}
True
{'c': 1, 'e': 1, 'h': 1, 'o': 1, 's': 1, 'r': 2, 't': 1}
{'a': 1, 'c': 1, 'e': 1, 'h': 1, 'o': 1, 's': 1, 'r': 2, 't': 1}
False
我是python新手,如果我错了,请原谅
我相信这可以用另一种方法完成:对给定的字符串排序,然后比较它们
def anagram(a, b):
# string to list
str1 = list(a.lower())
str2 = list(b.lower())
#sort list
str1.sort()
str2.sort()
#join list back to string
str1 = ''.join(str1)
str2 = ''.join(str2)
return str1 == str2
print(anagram('Orchestra', 'Carthorse'))
遍历字符串测试并验证字符串test1中存在的天气字符(如果存在),将数据存储在字符串值中。
如果等于返回True,则比较值的长度和test1的长度,否则返回False
def anagram(test,test1):
value =''
for data in test:
if data in test1:
value += data
if len(value) == len(test1):
return True
else:
return False
anagram("abcd","adbc")
def字谜(测试,测试1):
测试值=[]
如果len(test)=len(test1):
对于测试中的i:
值=test.count(i)=test1.count(i)
测试值。追加(值)
其他:
test_value.append(False)
检查test和test1的长度,如果长度匹配,则遍历字符串测试,如果匹配,则比较test和test1字符串中的字符数。如果匹配,则将值存储在字符串中。我以基本方式编写了易懂的字谜程序
def compare(str1,str2):
if((str1==None) or (str2==None)):
print(" You don't enter string .")
elif(len(str1)!=len(str2)):
print(" Strings entered is not Anagrams .")
elif(len(str1)==len(str2)):
b=[]
c=[]
for i in str1:
#print(i)
b.append(i)
b.sort()
print(b)
for j in str2:
#print(j)
c.append(j)
c.sort()
print(c)
if (b==c and b!=[] ):
print(" String entered is Anargama .")
else:
print(" String entered are not Anargama.")
else:
print(" String entered is not Anargama .")
str1=input(" Enter the first String :")
str2=input(" Enter the second String :")
compare(str1,str2)
一种更简洁、更通俗的方法是使用排序键&lower/upper键
您可以先对字符串进行排序,然后使用lower/upper使大小写保持一致,以便进行适当的比较,如下所示:
# Function definition
def test_for_anagrams (str_1, str_2):
if sorted(str_1).lower() == sorted(str_2).lower():
return True
else:
return False
#Main Program
str_1 = input("Enter a string 1: ")
str_2 = input("Enter a string 2: ")
result = test_for_anagrams (str_1, str_2)
print (result)
另一个解决方案:
def test_for_anagrams(my_string1, my_string2):
s1,s2 = my_string1.lower(), my_string2.lower()
count = 0
if len(s1) != len(s2) :
return False
for char in s1 :
if s2.count(char,0,len(s2)) == s1.count(char,0,len(s1)):
count = count + 1
return count == len(s1)
现在没有时间调试您的程序,但这里有一个简短的解决方案:返回计数器(str_1.lower())==计数器(str_2.lower())
使用集合中的计数器
。只需注意-计数器是集合
模块的一部分。我想贴一个答案,但是@timgeb更快:)你也可以排序然后比较。@pp_u是的,但是这个问题可以而且应该用O(n)来解决。@timgeb我完全同意,把它看作是一个旁注。如果导入不符合练习的精神,那么通过在每个字符串上循环一次,将你自己的计数器构造成一个普通的字典,然后比较它们。谢谢你的解决方案,但我只是在学习python。我不知道什么是集合或计数器。@KaranThakkar应用于字符串的计数器只是一个字典,它记录每个字符在字符串中出现的频率。所以Counter('barbaz')
会给你一本字典{'b':2'a':2'r':1'z':1}
<代码>计数器
只负责为您计数;但正如timgeb所说,你可以从一个空字典开始,然后自己循环字符串并计算字符数。从来没有想过这一点。太棒了。欢迎来到堆栈溢出!请尝试提供一个关于您的解决方案如何工作的详细描述。请参阅:。谢谢。这不起作用anagram(“bab”,“bad”)==True
而它应该是False
我错过了这个测试用例:def anagram(test,test1):value=''用于索引,data用于枚举(test):if test1中的数据:value+=data if len(value)==len len(test1)和sorted(value)==sorted(test1):返回True否则:返回False
if False in test_value:
return False
else:
return True
def compare(str1,str2):
if((str1==None) or (str2==None)):
print(" You don't enter string .")
elif(len(str1)!=len(str2)):
print(" Strings entered is not Anagrams .")
elif(len(str1)==len(str2)):
b=[]
c=[]
for i in str1:
#print(i)
b.append(i)
b.sort()
print(b)
for j in str2:
#print(j)
c.append(j)
c.sort()
print(c)
if (b==c and b!=[] ):
print(" String entered is Anargama .")
else:
print(" String entered are not Anargama.")
else:
print(" String entered is not Anargama .")
str1=input(" Enter the first String :")
str2=input(" Enter the second String :")
compare(str1,str2)
# Function definition
def test_for_anagrams (str_1, str_2):
if sorted(str_1).lower() == sorted(str_2).lower():
return True
else:
return False
#Main Program
str_1 = input("Enter a string 1: ")
str_2 = input("Enter a string 2: ")
result = test_for_anagrams (str_1, str_2)
print (result)
def test_for_anagrams(my_string1, my_string2):
s1,s2 = my_string1.lower(), my_string2.lower()
count = 0
if len(s1) != len(s2) :
return False
for char in s1 :
if s2.count(char,0,len(s2)) == s1.count(char,0,len(s1)):
count = count + 1
return count == len(s1)