【问题标题】:matching similar elements in between two lists匹配两个列表之间的相似元素
【发布时间】:2018-07-24 07:46:46
【问题描述】:

我是 python 新手,如果这是一个愚蠢的问题,我深表歉意。

我有两个列表
L1=['marvel','audi','mercedez','honda']

L2=['marvel comics','bmw','mercedez benz','audi'].

我想提取包含在list L2 中与list L1 匹配的匹配元素。所以我做了什么:

for i in L1:
   for j in L2:
       if j in i:
          print (j)

  output is ['audi']

但是,如果元素还包含任何单词匹配,例如mercedez benz 中的mercedezmarvel comics 中的marvel,我也想返回元素。所以最终的输出是:

j=['audi','mercedez benz','marvel comics']

【问题讨论】:

    标签: python arrays python-3.x pandas keyword-search


    【解决方案1】:

    我认为你真正想要的是L2 的元素,其中包含L1 中的任何元素。所以只需将if j in i 替换为if i in j

    for i in L1:
       for j in L2:
           if i in j:
              print (j)
    

    这个输出:

    marvel comics
    audi
    mercedez benz
    

    【讨论】:

    • 确实如此。很好地发现了我的错字。谢谢。
    【解决方案2】:

    如果您想使用regular expressions,那么您可以这样做:

    import re
    re.findall(".*|".join(L1),"\n".join(L2))
    
    ['marvel comics', 'mercedez benz', 'audi']
    

    【讨论】:

      【解决方案3】:

      这是使用str.startswith的一种方法

      例如:

      L1=['marvel','audi','mercedez','honda']  
      L2=['marvel comics','bmw','mercedez benz','audi']
      res = []
      for i in L2:
          for j in L1:
              if i.startswith(j):
                  res.append(i)
      print(res)
      

      输出:

      ['marvel comics', 'mercedez benz', 'audi']
      

      使用in

      例如:

      res = []
      for i in L2:
          for j in L1:
              if j in i:
                  res.append(i)
      print(res)
      

      【讨论】:

        【解决方案4】:

        一种高效的方法是构建一个“平面”字典,其中每个单词作为键,相关的单词组作为值。

        L2=['marvel comics','bmw','mercedes benz','audi']    
        match_dict = {k:v for v in L2 for k in v.split()}
        

        这是:

        {'audi': 'audi',
         'benz': 'mercedes benz',
         'bmw': 'bmw',
         'comics': 'marvel comics',
         'marvel': 'marvel comics',
         'mercedes': 'mercedes benz'}
        

        现在扫描第一个列表并在字典中发出元素:

        L1=['marvel','audi','mercedes','honda']
        result = [match_dict[x] for x in L1 if x in match_dict]
        

        结果:

        ['marvel comics', 'audi', 'mercedes benz']
        

        一旦建立字典,您就可以以高性能扫描大型列表(O(1) 查找)

        【讨论】:

          【解决方案5】:

          使用列表推导:

          [j for i in L1 for j in L2 if (j.startswith(i))]
          
          ['marvel comics', 'audi', 'mercedez benz']
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-21
            • 2019-01-27
            相关资源
            最近更新 更多