【问题标题】:Compare two lists and get matching results in a dictionary - python比较两个列表并在字典中获取匹配结果 - python
【发布时间】:2021-02-13 22:08:17
【问题描述】:

我有两个列表,我想找到具有相同/部分字符的项目并将结果放入字典中:

list_a= ['helloyou', 'waithere', 'byenow']

list_b =[ 'wait', 'hello', 'bye']

想要的结果:

dict_c= {'helloyou:hello', 'waithere:wait', 'byenow:bye'}

我试过了,但似乎不起作用:

dict_c= {j:i for i,j in zip(list_a,list_b) if re.match(j,i)} 

编辑:

我可能有一些开头不一样的项目,例如:

list_a= ['helloyou', 'waithere', 'byenow']

list_b =[ 'yeswait', 'plushello', 'nobye']

想要的结果:

dict_c= {'helloyou:plushello', 'waithere:yeswait', 'byenow:nobye'}

编辑

如果我可以有这样的情况,我可以使用分隔符来拆分项目并使用开头

list_a = ['hid/jui/helloyou', 'hhh/hdhdh/waithere', 'jcdjcjd/bdcdbc/byenow']

list_b = ['abc/efg/waitai_lp', 'hil/mno/helloai_lj', 'pqr/byeai_ki']

想要的结果

dict_c = {'hid/jui/helloyou:hil/mno/helloai_lj','hhh/hdhdh/waithere:abc/efg/waitai_lp', 'jcdjcjd/bdcdbc/byenow:pqr/byeai_ki'}

【问题讨论】:

  • 较长的字符串是否总是在list_a 中,或者它可以在任何一个中?
  • 也可以!
  • 最新更新的问题没有意义。您如何知道 2 个字符串之间的重叠何时足以匹配? 'helloyou:plushello' 匹配,因为 hello 很常见,但 abcd:blkm 也是如此,因为它们有 b 共同。
  • 这完全改变了您的主要问题。并使问题成为一个完全不同的问题。这是一个很好的问题,直到该编辑完全改变了整个问题:)
  • @AkshaySehgal 感谢您的回复,是的,这就是我努力寻找解决方案的原因。如果我可以有这样的情况,我可以使用分隔符来拆分项目并使用 list_a = ['hid/jui/helloyou', 'hhh/hdhdh/waithere', 'jcdjcjd/bdcdbc/byenow '] list_b = ['abc/efg/waitai_lp', 'hil/mno/helloai_lj', 'pqr/byeai_ki'] 想要的结果 dict_c = {'hid/jui/helloyou:hil/mno/helloai_lj', 'hhh/hdhdh /waithere:abc/efg/waitai_lp', 'jcdjcjd/bdcdbc/byenow:pqr/byeai_ki'}

标签: python list dictionary list-comprehension python-re


【解决方案1】:
list_a= ['helloyou', 'waithere', 'byenow']

list_b =[ 'wait', 'hello', 'bye']

dict_c = {a:b for a in list_a for b in list_b if a.startswith(b)}

输出dict_c: {'helloyou': 'hello', 'waithere': 'wait', 'byenow': 'bye'}

【讨论】:

    【解决方案2】:

    试试这个 -

    问题是您是zipping 2 个列表中的相应项目,而不是在它们之间使用cross-product。因此,在压缩版本中,只有 (bye,byenow) 会从 re.match 返回一些内容。

    from itertools import product
    
    {j:i for i,j in product(list_a, list_b) if re.match(j,i)} 
    
    {'hello': 'helloyou', 'wait': 'waithere', 'bye': 'byenow'}
    

    【讨论】:

      【解决方案3】:

      你可以考虑使用here解释的方法,结合@Akshay的回答

      from collections import Counter
      from itertools import product
      
      def shared_chars(s1, s2):
          return sum((Counter(s1) & Counter(s2)).values())
      
      {j:i for i,j in product(list_a, list_b) if shared_chars(j,i) > 3}
      

      困难的部分是根据一些参数(例如正在检查的字符串的长度)以动态方式设置常量值“3”。目前,我认为最短的单词“再见”是最少的

      【讨论】:

        猜你喜欢
        • 2020-07-06
        • 1970-01-01
        • 2022-06-28
        • 2020-06-26
        • 2021-01-10
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 2015-08-04
        相关资源
        最近更新 更多