2015-11-13 88 views
1
>> find_sub_anagram_in_wordlist('apple', ['ppl','al','app','apple']) 

['ppl'] 

爲什麼循環不添加其他子字典?Python for循環幫助,追加到列表

這裏是我的代碼:

anagramList = [] 

def find_sub_anagram_in_wordlist(str, str_list): 

    global anagramList 
    anagramList.clear() 
    list1 = list(str) 
    list1.sort() 
    for word in str_list: 
     shouldAdd = True 
     listi = list(word) 
     listi.sort() 
     for j in listi: 
      if j in list1: 
       list1.remove(j) 
      else: 
       shouldAdd = False 
     if shouldAdd == True: 
      anagramList.append(word) 
    return anagramList 
+0

你真的想從這段代碼中獲得什麼? – ZdaR

+0

第二個參數是要檢查的字符串列表,不管它們是否是第一個參數的子字典。我希望代碼在第二個參數中檢查列表中的每個元素,並將其添加到單獨的列表中,如果它是第一個參數的子字幕,那麼最後我要返回子字母列表。 –

+0

爲了清楚起見,請編輯您的代碼以顯示所需的輸出。 –

回答

1

這條線:

if j in list1: 
    list1.remove(j) 

是你的問題。想想的for word in str_list其中word == 'ppl

通過與下面的代碼在精神上第一次迭代:

for j in listi: #for every char in word, 'p', 'p', 'l' 
     if j in list1: 'True for all three 
      list1.remove(j) 'removes all three letters 
     else: 
      shouldAdd = False 

這個給你留下list1 == ['a','e']。您的下一個迭代word會給您word == 'al'。如果我們再次查看上面的代碼,則會看到list1,shouldAdd == False中不再有'l'。此外,由於a在裏面,現在不是,並且list1 == ['e']。你可以看到這是怎麼回事。

使用您的代碼,您可以通過將list1 = list(str)移動到for word in str_list:循環的內部來解決此問題,以便每次都重新初始化列表。我將嘗試尋找一種更加pythonic的方式來做這個功能,並在我可以的時候發佈它。

編輯:

這是我這樣做的方式:

>>> def is_sub_anagram(s, sub): 
    s = list(s) 
    try: 
     for c in sub: s.remove(c) 
    except: 
     return False 
    return True 
>>> def find_sub_anagram_in_wordlist(s, str_list): 
    return list(filter(lambda x: is_sub_anagram(s,x), str_list)) 

>>> find_sub_anagram_in_wordlist('apple',['app','ppl','ae','le']) 
['app', 'ppl', 'ae', 'le'] 

>>> find_sub_anagram_in_wordlist('apple',['app','ppl','ae','le','lle']) 
['app', 'ppl', 'ae', 'le'] 
+0

非常感謝您的幫助,我非常感謝! –

1

我認爲這將有助於簡化你在做什麼。特別是,在功能上將子項目測試與篩選候選項的過程分開。這將是我的做法:

def is_sub_anagram(word, candidate): 
    word = list(word) 
    for letter in candidate: 
     try: 
      word.remove(letter) 
     except ValueError: 
      return False 
    return True 


def filter_sub_anagrams(word, candidates): 
    return [ x for x in candidates if is_sub_anagram(word, x) ] 


print(filter_sub_anagrams('apple', [ 'ppl', 'al', 'app', 'apple', 'aapl' ])) 

輸出是:

['ppl', 'al', 'app', 'apple'] 

注意'aapl'不是也不應該被包含在輸出。

+0

哇,我們有幾乎相同的代碼...... thats赫然同步(y) –

+0

非常感謝您的幫助,我非常感謝它! –

+1

@RNar我的想法是你的嗎?你的想法是我的嗎? omg,我們哪一個是真的?! – jez