在Python中比较两个不同大小的列表

时间:2018-02-15 14:17:16

标签: python python-3.x list

我有两个不同大小的列表。一个有产品标题,另一个有品牌名称(可能是一个字或更多)。 我需要检查产品标题是否具有提到的确切品牌名称(存在于品牌列表中)并提取相同的其他返回空列表。 由于品牌可能包含多个单词,因此在提取匹配的品牌名称时面临问题。

例如。 : 以下是输入:

Product_Titles =[['Best abc def hair oil'],['laptop erg eds ram 15 GB'],['oops dfr watch']]

Brand_List = [['abc def'],['dfe sdf sd'],['erg eds']]

#Expected Output :
Brand = [['abc def'],['erg eds'],[]]

获取第三个产品标题的空列表,因为我们无法与Brand_List获得任何匹配的品牌。

P.S。 :

只有完整的品牌名称匹配,我们才会返回品牌名称。

我尝试过Regex,但它不起作用,因为如果我们有' str'在品牌列表和'字符串'在产品标题中,它会给出字符串'作为品牌。但我需要准确的输出。

非常感谢所有精彩的答案! 我综合了以下所有建议,并提出了我的相同版本。

解决方案:

Solution Code

2 个答案:

答案 0 :(得分:0)

对于python 2或3,如何解决此任务应该没有区别,只需循环遍历Product_Titles并将匹配保存到返回值:

Product_Titles =[['Best abc def hair oil'],['laptop erg eds ram 15 GB'],['oops dfr watch']]
Brand_List = [['abc def'],['dfe sdf sd'],['erg eds']]
ret = []

for product in Product_Titles:
  for brand in Brand_List:
    if brand[0] in product[0]:
      ret.append(brand)
      break
  else:
    ret.append([])
print(ret)
>> [['abc def'], ['erg eds'], []]

如果任何习语不清楚,请随意询问它们的含义。此外,如果行空间很宝贵,这个解决方案也可以表示为列表理解:

ret = [brand[0] for brand in Brand_List if brand[0] in prod[0]] for prod in Product_Titles]
print(ret)
>> [['abc def'], ['erg eds'], []]

这两者之间存在差异,到目前为止理解中不存在break。如果单个产品中存在多个品牌,则它们将全部列在返回的列表中。这似乎是合理的,我实际上会假设你也想在循环中使用这种行为。

另请注意,the google python stylesheet不鼓励使用长于一行(80个字符)的理解,而是使用循环。

答案 1 :(得分:0)

您可以使用列表理解:

Product_Titles =[['abc def hair oil'],['erg eds laptop'],['oops dfr watch']]
Brand_List = [['abc def'],['dfe sdf sd'],['erg eds']] 
titles = [[[i] if b.startswith(i) else [] for [i] in Brand_List] for [b] in Product_Titles]
final_titles = [filter(None, i)[0] if any(i) else [] for i in titles]

输出:

[['abc def'], ['erg eds'], []]