在蟒蛇
这两个字符串字谜测试问题:在蟒蛇
写接收两个字符串作为 参数,两者由字母字符组成,并返回 真如果两个字符串的函数命名test_for_anagrams anagrams,否则为False。两个字符串是 anagrams,如果一个字符串可以通过重新排列另一个字符串中的 字符来构造,那么该字符串只需使用原始字符串中的所有字符一次。例如,字符串“Orchestra”和 “Carthorse”是anagrams,因为每个人都可以通过 重新排列另一个人物中的所有字符 在其中一个字符中构造一次。请注意,在这里大小写 并不重要,即小写字符可以被认为与大写字符 相同。
我的代码:
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)
这里的问题是,当我输入一个字符串为Orchestra
和Carthorse
,它给我造成的False
。对于字符串The eyes
和They see
也是如此。任何帮助,将不胜感激。
我是新来的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'))
从来没有想到这一点。真棒。 –
问题是你只是检查是否有任何字符匹配存在于字符串中,然后递增计数器。你不会考虑你已经与另一个人匹配的字符。这就是为什么下面也将失败:
>>> test_for_anagrams('aa', 'aa')
False
即使字符串是等于(并因此也是一个字谜),你是第一个字符串的每个a
与另一串的每个a
匹配,所以你的计数为4
,结果为False
。
你应该做的一般是计算每个字符的出现次数,并确保每个字符在每个字符串中经常出现。您可以通过使用collections.Counter
对象来计数字符。然后你只需要检查每个字符串的计数是否是相同的,你可以很容易做到通过比较计数器对象(这只是字典):
from collections import Counter
def test_for_anagrams (str_1, str_2):
c1 = Counter(str_1.lower())
c2 = Counter(str_2.lower())
return c1 == c2
>>> test_for_anagrams('Orchestra', 'Carthorse')
True
>>> test_for_anagrams('aa', 'aa')
True
>>> test_for_anagrams('bar', 'baz')
False
为了完整性:如果只是输入Counter
并且练习完成并不符合练习的精神,您可以使用普通字典来计算字母。
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
演示:
print(test_for_anagrams('The eyes', 'They see'))
print(test_for_anagrams('orchestra', 'carthorse'))
print(test_for_anagrams('orchestr', 'carthorse'))
输出:
{' ': 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
没有时间来调试程序的权利,但这里的短期解决办法:'返回计数器(str_1.lower())==计数器(str_2.lower())'和'Counter'从'collections' 。 – timgeb
只是一个音符 - Counter是'collections'模块的一部分。 我想它张贴一个答案,但@timgeb的速度更快:) –
好的谢谢。 –