两个字符串列表:从列表A中删除包含列表B中任何字符串的字符串?

时间:2014-10-04 04:36:06

标签: python list

我有两个字符串列表。

filters = ['foo', 'bar']

wordlist = ['hey', 'badge', 'foot', 'bar', 'cone']

我想删除包含过滤器的wordlist中的每个单词。

def filter_wordlist(filters, wordlist):

    for word in wordlist:
        if word contains any string from filters, remove it from the wordlist

    return wordlist

因此,此过滤器函数将返回['hey', 'badge', 'cone']。它已移除bar,因为bar位于filters。它删除了foot,因为它包含字符串foo

我试过了:

for word in wordlist:
    for f in filters:
        if f in word:
            wordlist.remove(word)

但它始终返回ValueError: list.remove(x): x not in list。所以我尝试将它包装在一系列越来越令人沮丧的try / except块中,但是没有任何东西可以用于gopher hole。我在remove命令下面添加了一个break语句,但那是......参差不齐。似乎wordlist末尾的项目未被正确过滤。

所以我改变了策略:

for f in filters:
    for word in wordlist:
        if f in word:
            wordlist.remove(word)

这与以前一样不稳定。

所以我尝试了这个:

for word in wordlist:
    if any(f in word for f in filters):
        wordlist.remove(word)

现在它确实让我感到恼火。参差不齐。到现在为止,我已经意识到发生了什么 - 使用remove()正在改变列表,因为我正在迭代它,这就搞砸了迭代。

这看起来应该非常简单。我有两个字符串列表。获取列表A中的所有项目。如果这些项目中的任何项目包含列表B中的任何项目,则从列表A中删除该项目。

这是我最终获得的工作解决方案:

keepitup = True

while keepitup:
    start_length = len(wordlist)
    for word in wordlist:
        if any(f in word for f in filters):
            wordlist.remove(link)
    end_length = len(wordlist)
    if start_length != end_length:
        keepitup = True
    else:
        keepitup = False

这看起来很荒谬。当然有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

您可以使用列表理解:

wordlist = [word for word in wordlist if all(f not in word for f in filters)]

或过滤功能:

filter(lambda word: all(f not in word for f in filters), wordlist)

或者您可以遍历wordlist的副本:

for word in wordlist[:]:
    if any(f in word for f in filters):
        wordlist.remove(word)