2015-11-05 216 views
-4

我想用2个参数(x,y)创建一个函数,x和y是一个字符串,如果x是y的子字母,则返回true。例如:“红色”是“reda”的子字谜,但“reda”不是“红色”的子字谜。判断一个字符串是否是另一个子字符

到目前为止我得到了: 我已经将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

+0

可能重复[如果字符串中的所有字符都在另一个字符串中,则返回True](http://stackoverflow.com/questions/28997056/return-true-if-all-characters-in-a-string在另一个字符串中) – ZN13

+0

@ ZN13不是这样 - 在评估“芦苇”是否是“红色”子项时,请考虑比较“芦苇”和“红色”,而不要返回“真” – zehnpaard

+1

是一个词是一个子项本身?还是一个子网格必须严格小于原来的? – zehnpaard

回答

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

+0

谢谢!它的工作,但我怎么会写它没有使用计数器? – Yowhatup

+0

嗯,可能类似于将'try-except ValueError'与's1:s2.remove(char)'中的char组合起来 - 不是最有效的,我总是会使用'Counter'作为这样的事情,因为它感觉更多可读。 – zehnpaard

0

我不认为你可以检查x中的每个字符是否存在于y中,因为这不能解释x中重复的字符。换句话说,'reeeeed'不是'reda'的子烙印。

这是做这件事:

  1. 使Ÿ
  2. 的副本,在X的每个字符,如果该字符出现在y复制,从y复制删除。如果它不存在,则返回false。
  3. 如果您到达循环的结尾并且y-copy为空,则返回false。 (x是一个字谜,但不是一个子字谜)。
  4. 否则返回true。
+0

我会如何制作y的副本?香港专业教育学院得到这个至今,但我只是无法弄清楚如何检查并删除 高清ANA(STR1,STR2): S1 =单(STR1) S2 =名单(STR2) s1.sort() s2.sort( ) 在S2字母: 如果字母S1: 打印(字母) 其他: 返回False – Yowhatup

+0

'y_copy =名单(Y)' –

+0

嘿,我已经做到了,但我想知道怎么做你说的第二和第三部分。 – Yowhatup

相关问题