【问题标题】:Comparing two List of Lists of different sizes in Python在 Python 中比较两个不同大小的列表列表
【发布时间】:2018-02-15 14:17:16
【问题描述】:

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

例如。 : 以下是输入:

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 匹配的品牌。

附: :

只有当完整的品牌名称匹配时,我们才应该返回品牌名称。

我尝试过正则表达式,但它不起作用,因为如果我们在品牌列表中有“str”,在产品标题中有“string”,它会将“string”作为品牌。但我需要准确的输出。

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

解决方案:

Solution Code

【问题讨论】:

标签: python python-3.x list


【解决方案1】:

您可以使用列表推导:

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'], []]

【讨论】:

  • 啊...你应该在一个班轮中完成它! :-) :-) final_titles = [filter(None, a)[0] if any(a) else [] for a in [[[i] if b.startswith(i) else [] for [i] in Brand_List] for [b] in Product_Titles]]
  • 如果品牌出现在产品标题的中间怎么办?那我们怎么解决呢?编辑了问题。对不起
【解决方案2】:

对于 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 个字符)的推导式,而是使用循环。

【讨论】:

  • 如果品牌出现在产品标题的中间怎么办?那我们怎么解决呢?编辑了问题。
  • 这不是问题。 in 关键字 which performs the check 不关心子字符串出现在字符串的哪个位置。
  • 谢谢阿恩。很有帮助!
  • @AbhayRajSingh 如果这个或其他答案对您有所帮助,请考虑支持或接受它,以向未来的读者表明它是否是问题的解决方案 =)
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多