评估字符串是否是另一个字符串

时间:2015-11-05 20:48:10

标签: python string function

我想创建一个带有2个参数(x,y)的函数,x和y是一个字符串,如果x是y的子字形,则返回true。例如:“red”是“reda”的子字谜,但“reda”不是“red”的子字谜。

到目前为止,我得到了: 我已将x,y转换为列表然后对它们进行排序。这样我可以比较每个字符串的字母表。

def sub_anagram(str1, str2):
    s1 = list(str1)
    s2 = list(str2)
    s1.sort()
    s2.sort()
    for letters in s2:
        if letters in s1: 
            return True
        else:
            return False

我感到困惑的是: 我想将字符串y与x进行比较,如果y包含x中的所有字符,则返回true,否则返回false

2 个答案:

答案 0 :(得分:1)

您可以使用collections.Counter

from collections import Counter
def subanagram(str1, str2):
    str1_counter, str2_counter = Counter(str1), Counter(str2)
    return all(str1_counter[char] <= str2_counter[char]
                 for char in str1_counter)

在上面的代码中,str1_counter基本上是一个字典,其中字符显示在str1中,其频率为键值。同样适用于str2_counter

然后,代码会检查str1中的所有字符,str2中的字符至少与str1中的字符一样多。

编辑:如果定义了一个精确小于原始的子标记,例如您希望subanagram("red", "red")False,然后首先比较两个计数器是否相等。

from collections import Counter
def subanagram(str1, str2):
    str1_counter, str2_counter = Counter(str1), Counter(str2)
    if str1_counter == str2_counter:
        return False
    return all(str1_counter[char] <= str2_counter[char]
                 for char in str1_counter)

如果由于某种原因我使用Counter,那将会是这样的:

def subanagram(str1, str2):
    if len(str1) == len(str2):
        return False  #Ensures strict subanagram

    s2 = list(str2)
    try:
        for char in str1:
            s2.remove(char)
    except ValueError:
        return False
    return True

但正如您所看到的,与使用Counter相比,它更长,更少声明且效率更低。

答案 1 :(得分:0)

我认为你不能只检查y中存在的x中的每个字符,因为这并不能解释在x中重复的字符。换句话说,'reeeeed'不是'reda'的子字谜。

这是一种方法:

  1. 制作y
  2. 的副本
  3. 对于x中的每个字符,如果该字符存在于y副本中,则将其从y副本中删除。如果不存在,则返回false。
  4. 如果到达循环的末尾并且y-copy为空,则返回false。 (x是字谜,但不是字卦。)
  5. 否则返回true。