繁体   English   中英

查找两个列表之间的交集大小

[英]Find the size of intersection between two lists

我正在尝试编写一个函数,该函数返回两个列表之间的公共元素的数量。 如果元素在L1出现j次,在L2出现k次,则共享jk元素中的最小值。

例子:

L1 = [1, 2, 3, 4, 5]
L2 = [4, 2]
L3 = [1, 2, 3, 4, 4, 5, 5]
intersection_size ( L1 , L2 ) => 2
intersection_size ( L1 , L3 ) => 5

我的想法是按升序对L1L2进行排序,然后比较每个元素:

def intersection(L1, L2):
    dL1 = L1[:]
    dL2 = L2[:]
    dL1.sort()
    dL2.sort()
    if dL1[1:] == [] or dL2[1:] == []:
        return 0
    if dL1[0] == dL2[0]:
        return 1 + intersection(dL1[1:], dL2[1:])
    elif dL1[0] > dL2[0]:
        return 0 + intersection(dL1, dL2[1:])
    elif dL1[0] < dL2[0]:
        return 0 + intersection(dL1[1:], dL2)

但是,当我测试intersection([1, 6, 1, 4], [1, 2, 3, 4]) ,该函数给了我 1 而不是 2。有人可以告诉我哪个部分是错误的吗?

我创建了dL1dL2因为我希望L1L2出于其他目的而保持不变,而且由于我是初学者,我只允许使用基本递归和抽象列表函数来执行此操作。

这部分在逻辑上是不正确的:

    if dL1[1:] == [] or dL2[1:] == []:
        return 0

基本情况应该是当一个或两个列表为空时。 但是当一个或两个列表具有单个元素时,您将返回 0。 这是不正确的,因为该元素仍然可能是匹配项,因此交集的大小不会为 0。如果将此条件更改为dL1 == [] or dL2 == []则它可以工作:

>>> intersection(L1, L2)
2
>>> intersection(L1, L3)
5
>>> intersection([1, 6, 1, 4], [1, 2, 3, 4])
2
>>> intersection([1, 1, 1, 2, 2], [1, 1, 2, 2, 2])
4

以下将起作用

len(set(L1) & set(L3))

如果您不想使用sets ,您可以执行以下操作:

def intersection(L1, L2):
    return len([x for x in L1 if x in L2])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM