2016-02-26 148 views
2

這兩個字符串字謎測試問題:在蟒蛇

寫接收兩個字符串作爲 參數,兩者由字母字符組成,並返回 真如果兩個字符串的函數命名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

好的謝謝。 –

回答

4

我是新來的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

從來沒有想到這一點。真棒。 –

3

問題是你只是檢查是否有任何字符匹配存在於字符串中,然後遞增計數器。你不會考慮你已經與另一個人匹配的字符。這就是爲什麼下面也將失敗:

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

1

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