【问题标题】:Python - Comparing two lists of setsPython - 比较两个集合列表
【发布时间】:2013-08-06 17:07:14
【问题描述】:

我有两个列表:

list1 = [
    set(['3105']),
    set(['3106', '3107']),
    set(['3115']),
    set(['3122']),
    set(['3123', '3126', '286'])
]

list2 = [
    set(['400']),
    set(['3115']),
    set(['3100']),
    set(['3107']),
    set(['3123', '3126'])
]

我如何比较这些列表的交集,例如,如果 3126 在两个列表的任何集合中的某个位置,它将附加另一个带有 3126 的列表。我的最终目标是附加一个单独的列表,然后取列表的长度,这样我就知道列表之间有多少匹配项。

【问题讨论】:

    标签: python list intersection set


    【解决方案1】:

    您必须合并所有集合;取两个列表中集合的并集,然后取这两个并集的交集:

    sets_intersection = reduce(set.union, list1) & reduce(set.union, list2)
    
    if 3126 in sets_intersection:
        # ....
    

    【讨论】:

      【解决方案2】:
      >>> common_items = set().union(*list1) & set().union(*list2)
      >>> common_items
      set(['3123', '3115', '3107', '3126'])
      >>> '3126' in common_items
      True
      

      时间比较:

      >>> %timeit reduce(set.union, list1) & reduce(set.union, list2)
      100000 loops, best of 3: 11.7 us per loop
      >>> %timeit set().union(*list1) & set().union(*list2)      #winner
      100000 loops, best of 3: 4.63 us per loop
      >>> %timeit set(s for x in list1 for s in x) & set(s for x in list2 for s in x)
      10000 loops, best of 3: 11.6 us per loop
      >>> %timeit import itertools;set(itertools.chain.from_iterable(list1)) & set(itertools.chain.from_iterable(list2))
      100000 loops, best of 3: 9.91 us per loop
      

      【讨论】:

        【解决方案3】:

        您可以将两个集合列表展平为集合:

        l1 = set(s for x in list1 for s in x)
        l2 = set(s for x in list2 for s in x)
        

        然后你可以计算交集:

        common = l1.intersection(l2)  # common will give common elements
        print len(common) # this will give you the number of elements in common.
        

        结果:

        >>> print common
        set(['3123', '3115', '3107', '3126'])
        >>> len(common)
        4
        

        【讨论】:

        • set(itertools.chain.from_iterable(list1)) 将比嵌套 LC 更快。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        相关资源
        最近更新 更多