2013-04-30 55 views
1

我在相关问题上阅读了很多问题,但他们都没有回答我的问题。我有两个列表:在Python中比较两个列表的项目

List A = ['nike', 'adidas', 'reebok'] 

List B = ['sneakers', 'sneaker shoes', 'adidas shoes', 'nike', 'any shoe', 'all nikes', 'a nike shoe'] 

现在,我想看看B中的某处存在表A的项目,使其返回:

List result: [False, False, True, True, False, True, True] 

真正代表列表B中的实例,其中一个A的项目被匹配。到目前为止,我已经使用了这个代码,这看起来非常低效。

for j in range(len(lista)): 
    for k in b: 
    if j in k: 
     lista[j] = 'DELETE' 

cuent = lista.count('DELETE') 

for i in range(cuent): 
    lista.remove('DELETE') 

在此先感谢和抱歉,如果确有一个答案 - 一个小时后,我已经失去了在计算器宇宙:)

编辑找到它的希望:对不起,不使我自己清楚 - 我不是在寻找完全匹配,我正在寻找词组匹配。再次抱歉!

回答

5

也许

keywords = ['nike', 'adidas', 'reebok'] 
items = ['sneakers', 'sneaker shoes', 'adidas shoes', 'nike', 'any shoe', 'all nikes', 'a nike shoe'] 
bits = [any(keyword in item for keyword in keywords) for item in items] 

或更好

import re 
regex = re.compile(r'%s' % '|'.join(keywords)) 
bits = [bool(regex.search(x)) for x in items] 

从我的理解,要忽略字边界(例如 “耐克” 匹配 “的所有耐克”),只搜索完整的单词,将上述表达式更改为r'\b(%s)\b'

+0

这是完美的 - 我还不熟悉这个很短的“(关键字中的关键字在关键字中的关键字)” - 表达式 - 你知道我可以在哪里了解更多?谢谢! – oliver13 2013-04-30 09:04:40

+1

@ oliver13查看[文档中的列表解析](http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions) – TerryA 2013-04-30 09:06:22

+2

@ oliver13:这被称为“生成器表达式”。见例如http://stackoverflow.com/q/1756096/989121解释。 – georg 2013-04-30 09:07:34