【问题标题】:Creating anagram detector创建字谜检测器
【发布时间】:2023-03-09 04:38:01
【问题描述】:

我无法让这个 anagram 函数正常工作。目的是为了 获取2个字符串abccba的函数,将它们转换为列表; 按字母顺序对它们进行排序,比较列表中的元素并打印它们是否是字谜。

我的代码如下...

def anagram(str1, str2):
    x = str1
    y = str2

    x1 = x.sort()
    y1 = y.sort()

    if (x1) == (y1):
        print("Anagram is True")
    else:
        print("Anagram is False")

str1 = str('abc')
str2 = str('cba')

print(anagram(str1, str2))

【问题讨论】:

  • x 和 y 的类型是什么?他们有sort 方法吗? x.sort() 在做什么?
  • 您不能使用.sort 字符串,一旦它们成为列表,请注意.sort()就地,并返回None。此外,本地别名似乎没有意义,例如str1x
  • sorted(x) == sorted(y)
  • 请注意,您的整个函数可以简化为print("Anagram is {!r}".format(sorted(str1) == sorted(str2)))

标签: python anagram


【解决方案1】:

你的问题是你不能打电话给String.sort()。尝试改变:

x1 = x.sort()
y1 = y.sort()

到:

x1 = sorted(x)
y1 = sorted(y)

【讨论】:

    【解决方案2】:

    具体问题

    如果x 是一个列表,x.sort() 就地工作。这意味着 sort 方法改变了对象的内部表示。它还返回None,这就是它不能按预期工作的原因。

    如果x 是字符串,则没有.sort() 方法,因为字符串是不可变的。

    我建议改用sorted() 函数,它返回排序后的字符串。

    更普遍的问题

    还有两个更普遍的问题:

    1. 运行时:这是一个 O(log(n) * n) 解决方案
    2. Unicode 修饰符和复合字形
    3. 打印:您打印值,但您应该返回结果。您将如何测试您的代码?

    Unicode 修饰符

    假设你写的函数更紧凑:

    def is_anagram(a: str, b: str) -> bool:
        return sorted(a) == sorted(b)
    

    这适用于普通字符,但不适用于复合字形。例如,可以修改 thumbsup / thumbsdown 表情符号以具有不同的颜色。颜色的变化实际上是赋予肤色的第二个 unicode“字符”。修饰符和前一个字符属于一起,但sorted 只查看代码点。结果是这样的:

    >>> is_anagram("???", "???")
    True  # <-- This should be False!
    

    Sublime Text 显示实际代码点:

    您可以使用 grapheme 包轻松解决此问题:

    from grapheme import graphemes
    def is_anagram(a: str, b: str) -> bool:
        return sorted(graphemes(a)) == sorted(graphemes(b))
    

    运行时

    如果你不排序,你可以获得 O(n) 运行时间,而是计算字符数:

    from collections import Counter
    from grapheme import grahemes
    
    def is_anagram(a: str, b: str) -> bool:
        return not (Counter(grapheme(a)) - Counter(grapheme(b)))
    

    【讨论】:

      【解决方案3】:

      你不能在一个字符串上调用.sort(),你也不应该因为这实际上是一种对列表进行排序并且不会返回任何内容的方法。相反,请使用sorted(x)

      >>> def anagram(str1, str2):
          x1 = sorted(str1)
          y1 = sorted(str2)
      
          if (x1) == (y1):
              print("Anagram is True")
          else:
              print("Anagram is False")
      
      
      >>> anagram('abc','bca')
      Anagram is True
      

      【讨论】:

      • 这是完美的。感谢您的帮助。
      猜你喜欢
      • 2019-04-16
      • 2012-04-03
      • 2019-09-14
      • 2016-06-14
      • 2019-11-20
      • 2018-03-22
      • 2019-07-27
      • 2019-07-10
      • 2012-11-07
      相关资源
      最近更新 更多