我想创建一个带有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
答案 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'的子字谜。
这是一种方法: