【问题标题】:How to find Intersection and Union of a List (without using sets)如何查找列表的交集和并集(不使用集合)
【发布时间】:2018-04-12 05:12:15
【问题描述】:

我正在尝试查找两个列表的交集和并集以进行分配,但是,我不能使用集合。从集合论来看,两个集合之间的交集是两个集合中的元素。联合是两个集合中的所有元素,没有重复。到目前为止,我有:

setA = [1,2,3,4,5,6,7,8,9]
setB = [1,5,0,9]

def getUnion(a, b):
    return a + b

def getIntersection(a, b):
    return 

我的联合函数返回重复项。有没有办法简单地找到工会?

另外,找到交叉点的最佳方法是什么?

【问题讨论】:

标签: python union intersection


【解决方案1】:

您可以改用collections.Counter 来计算并集和交集

>>> from collections import Counter

>>> c = Counter(setA + setB)
>>> [a[0] for a in c.items() if a[1] > 1] #Intersection
>>> [1,5,9]

>>> list(c.keys()) #Union
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Counter 对象以格式保存数据:

>>> c
>>> Counter({1: 2, 5: 2, 9: 2, 0: 1, 2: 1, 3: 1, 4: 1, 6: 1, 7: 1, 8: 1})

键是列表中的元素,值是列表中元素的出现次数。

【讨论】:

    【解决方案2】:

    所以,假设您可以使用sort。先对两个列表排序,再对两个指针做,每次往前移动一个值较小的指针。

    对于 union func,每次将所有值相加,并在它们的值相等时向前移动两个指针。 对于交集函数,只有在值相等时才添加值。

    时间 O(nlogn+n)->O(nlogn)

    【讨论】:

      【解决方案3】:

      不使用集合的联合和交集:

      setA = [1,2,3,4,5,6,7,8,9]
      setB = [1,5,0,9]
      
      intersection = [i for i in setA if i in setB]
      list_union = list({i: i for i in setA + setB}.values())
      
      print(intersection)
      print(list_union)
      

      输出:

      [1, 5, 9]
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
      

      解释

      对于联合:

      [i for i in setA if i in setB]
      

      只需循环通过setA 并添加在setB 中也存在的元素

      对于路口:

      list({i: i for i in setA + setB}.values())
      

      创建一个字典,其中键和值是setA + setB 的结果。由于字典中的键是唯一的,因此重复项不会出现在最终字典中,而list(dct.values()) 用于仅从字典中提取所需的值。

      【讨论】:

        【解决方案4】:

        试试这个:

        setA = [1,2,3,4,5,6,7,8,9]
        setB = [1,5,0,9]
        
        print (list(set(setA).intersection(setB)))
        

        输出:

        [1, 5, 9]
        [Finished in 0.0s]
        

        【讨论】:

        • 它说他不能在问题中使用集合。
        猜你喜欢
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 2012-01-21
        • 2012-03-25
        • 1970-01-01
        • 2021-03-14
        • 2022-01-16
        相关资源
        最近更新 更多