您可以使用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