在蟒蛇

在蟒蛇

问题描述:

这两个字符串字谜测试问题:在蟒蛇

写接收两个字符串作为 参数,两者由字母字符组成,并返回 真如果两个字符串的函数命名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) 

这里的问题是,当我输入一个字符串为OrchestraCarthorse,它给我造成的False。对于字符串The eyesThey see也是如此。任何帮助,将不胜感激。

+4

没有时间来调试程序的权利,但这里的短期解决办法:'返回计数器(str_1.lower())==计数器(str_2.lower())'和'Counter'从'collections' 。 – timgeb

+0

只是一个音符 - Counter是'collections'模块的一部分。 我想它张贴一个答案,但@timgeb的速度更快:) –

+0

好的谢谢。 –

我是新来的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')) 
+0

从来没有想到这一点。真棒。 –

问题是你只是检查是否有任何字符匹配存在于字符串中,然后递增计数器。你不会考虑你已经与另一个人匹配的字符。这就是为什么下面也将失败:

>>> 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 
+0

如果进口没有在运动的精神,构建自己的柜台,通过循环每串一次普通的字典,然后对它们进行比较。 – timgeb

+0

谢谢你的解决方案,但我只是在学习python。我不知道什么是藏品或柜台。 –

+0

@KaranThakkar应用在一根绳子上的计数器就是以跟踪每个字符出现的频率在字符串中的字典。所以Counter('barbaz')'会给你一个字典'{'b':2,'a':2,'r':1,'z':1}'。 '计数器'只是为你计算;但正如timgeb所说,你可以从一个空字典开始,只是循环遍历字符串并自己计算字符。 – poke

为了完整性:如果只是输入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