【问题标题】:Anagram test for two strings in pythonpython中两个字符串的字谜测试
【发布时间】:2016-02-26 10:52:24
【问题描述】:

这是问题:

编写一个名为 test_for_anagrams 的函数,它接收两个字符串 参数,两者都由字母字符组成并返回 如果两个字符串是字谜,则为 True,否则为 False。两个字符串是 字谜,如果一个字符串可以通过重新排列来构造 使用其他字符串中的所有字符 原始字符串恰好一次。例如,字符串“Orchestra”和 “Carthorse”是字谜,因为每一个都可以由 使用所有字符重新排列另一个字符中的字符 在其中一个中恰好一次。请注意,大小写无关紧要 这里即小写字符可以被认为与 大写字符。

我的代码:

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 相同。任何帮助将不胜感激。

【问题讨论】:

  • 现在没时间调试你的程序,但这里有一个简短的解决方案:return Counter(str_1.lower()) == Counter(str_2.lower())Counter 来自collections
  • 只是一个注释 - 计数器是 collections 模块的一部分。我想发布答案,但@timgeb 更快:)
  • 也可以排序再比较。
  • @pp_ 是的,但是这个问题可以而且应该在 O(n) 中解决。
  • @timgeb 我完全同意,将其视为附注。

标签: python python-3.x


【解决方案1】:

我是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'))

【讨论】:

  • 从来没有想过这个。太棒了。
【解决方案2】:

问题是您只需检查字符串中是否存在 any 字符匹配项,然后递增计数器。您不考虑已经与另一个匹配的字符。这就是为什么以下操作也会失败:

>>> test_for_anagrams('aa', 'aa')
False

即使字符串是 equal(因此也是一个字谜),您将第一个字符串的每个 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

【讨论】:

  • 如果导入不符合练习的精神,请通过循环每个字符串一次将您自己的计数器构建为普通字典,然后比较它们。
  • 感谢您的解决方案,但我只是在学习 python。我不知道什么是集合或计数器。
  • @KaranThakkar 应用于字符串的计数器只是一个字典,用于跟踪每个字符在字符串中出现的频率。所以Counter('barbaz') 会给你一本字典{'b': 2, 'a': 2, 'r': 1, 'z': 1}Counter 只为你数数;但正如 timgeb 所说,您可以从一个空字典开始,然后循环遍历字符串并自己计算字符。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    遍历字符串 test 并验证字符串 test1 中存在的天气字符(如果存在)将数据存储在字符串值中。 比较 value 的长度和 test1 的长度 if equals return True Else 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")
    

    【讨论】:

    • 欢迎来到 Stack Overflow!请尝试提供有关您的解决方案如何工作的精彩描述。请参阅:How do I write a good answer?。谢谢。
    • 这不起作用anagram("bab","bad") == True,而它应该是False
    • 我错过了这个测试用例:def anagram(test,test1): value ='' for index,data in enumerate(test): if data in test1: value += data if len(value) == len(test1) and sorted(value) == sorted(test1) : return True else: return False
    【解决方案5】:

    我已经以基本的方式完成了Anagram Program,并且易于理解。

        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)
    

    【讨论】:

      【解决方案6】:

      一种更简洁和 Pythonic 的方法是使用排序和下/上键。

      您可以先对字符串进行排序,然后使用 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)
      

      【讨论】:

        【解决方案7】:

        另一种解决方案:

        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)
        

        【讨论】:

          【解决方案8】:

          定义字谜(测试,测试1): 测试值 = [] 如果 len(test) == len(test1): 对于我在测试中: 值 = test.count(i) == test1.count(i) test_value.append(值) 别的: test_value.append(False)

          if False in test_value:
              return  False
          else:
              return True
          

          检查 test 和 test1 的长度,如果长度匹配则遍历字符串 test 并比较 test 和 test1 字符串中的字符数,如果匹配则将值存储在字符串中。

          【讨论】:

            猜你喜欢
            • 2018-06-07
            • 2020-10-28
            • 2017-03-16
            • 2019-03-16
            • 2016-06-24
            • 2016-06-23
            • 2016-04-07
            • 2014-04-13
            相关资源
            最近更新 更多