删除两个列表中的公共项

iyfjxgzm  于 2022-09-18  发布在  Java
关注(0)|答案(4)|浏览(184)

我有一个问题,就是使用Python函数UnCommon(L1,L2),它将两个按升序排序的列表作为参数,并返回出现在两个列表中的一个列表中的所有元素的列表。返回的列表应按升序排列。所有这样的元素应该只列出一次,即使它们在L1或L2中多次出现。

因此,uncommon([2,2,4],[1,3,3,4,5])应返回[1,2,3,5],而uncommon([1,2,3],[1,1,2,3,3])应返回[]

我试过了

def uncommon(l1,l2):
  sl1=set(l1)
91zkwejq

91zkwejq1#

使用集合是一个很好的开始-集合具有关于组操作的良好逻辑。
如果我们使用维恩图,我们可以看到“不常见的”元素是两个列表的“并集”中的所有元素减去两个列表的“交集”(白色部分是交集):

在Python中,这称为symmetric difference,并内置于以下集合中:

def uncommon(l1, l2):
    set1 = set(l1)
    set2 = set(l2)
    return sorted(set1.symmetric_difference(set2))

print(uncommon([2, 2, 4], [1, 3, 3, 4, 5]))  # [1, 2, 3, 5]
print(uncommon([2, 2, 4], [1, 3, 3, 4, 5, 255]))  # [1, 2, 3, 5, 255]
print(uncommon([1, 2, 3], [1, 1, 2, 3, 3]))  # []
cpjpxq1n

cpjpxq1n2#

For a solution that doesn't require sorting (O(n*logn)), you can merge the sorted lists with heapq.merge after removing the duplicates and intersections:

from heapq import merge

def uncommon(l1,l2):
    d1 = dict.fromkeys(l1)
    d2 = dict.fromkeys(l2)
    drop = set(d1).intersection(d2)
    return list(merge(*([x for x in d
                         if not x in drop]
                        for d in [d1, d2])))

uncommon([2,2,4], [1,3,3,4,5,256])

# [1, 2, 3, 5, 256]
zbq4xfa0

zbq4xfa03#

要从两个列表中获取非公共元素,请从两个列表的并集(list1+list2)中移除公共元素。

def uncommon(l1,l2):
    l1 = set(l1)
    l2 = set(l2)
    return sorted(list(l1.union(l2) - (l1.intersection(l2))))

print(uncommon([2,2,4],[1,3,3,4,5]))
print(uncommon([1,2,3],[1,1,2,3,3]))

输出量

[1, 2, 3, 5]
[]
wnavrhmk

wnavrhmk4#

公共元素是包含在两个列表中的元素。因此,首先删除列表1中也在列表2中的元素。然后删除列表2中也在列表1中的元素。返回剩余的元素。

def uncommon(l1, l2):
    d1=l1-l2
    d2=l2-l1
    return d1+d2

相关问题