2015-11-13 63 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