我有两个字符串列表。
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
这看起来很荒谬。当然有更好的方法吗?
答案 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)