您可以使用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
。
可能重复[如果字符串中的所有字符都在另一个字符串中,则返回True](http://stackoverflow.com/questions/28997056/return-true-if-all-characters-in-a-string在另一个字符串中) – ZN13
@ ZN13不是这样 - 在评估“芦苇”是否是“红色”子项时,请考虑比较“芦苇”和“红色”,而不要返回“真” – zehnpaard
是一个词是一个子项本身?还是一个子网格必须严格小于原来的? – zehnpaard