2015-11-05 218 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

相關問題