在Python中不使用集合的两个列表之间的公共元素

2024-05-13 22:56:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我要计算两个列表中相同的元素。列表可以有重复的元素,因此我无法将其转换为集合并使用&;运算符。

a=[2,2,1,1]
b=[1,1,3,3]

设置(a)和设置(b)工时
a&b不工作

有可能在没有录音和听写的情况下做吗?


Tags: 元素列表情况运算符amp录音工时
3条回答

在Python3.x(以及Python2.7发布时)中,可以使用collections.Counter来完成以下操作:

>>> from collections import Counter
>>> list((Counter([2,2,1,1]) & Counter([1,3,3,1])).elements())
[1, 1]

这里有一个使用collections.defaultdict(在Python 2.5和更高版本中提供)的替代方法。它有一个很好的特性,即结果的顺序是确定的(它本质上对应于第二个列表的顺序)。

from collections import defaultdict

def list_intersection(list1, list2):
    bag = defaultdict(int)
    for elt in list1:
        bag[elt] += 1

    result = []
    for elt in list2:
        if elt in bag:
            # remove elt from bag, making sure
            # that bag counts are kept positive
            if bag[elt] == 1:
                del bag[elt]
            else:
                bag[elt] -= 1
            result.append(elt)

    return result

对于这两种解决方案,输出列表中任何给定元素x的出现次数是两个输入列表中x出现次数的最小值。你的问题不清楚这是否是你想要的行为。

SilentGhost、Mark Dickinson和Lo'oris是对的,非常感谢您报告这个问题-我需要列表的公共部分,因此:

a=[1,1,1,2]

b=[1,1,3,3]

结果应为[1,1]

很抱歉在不合适的地方发表评论-我今天已经注册了。

我修改了你的解决方案:

def count_common(l1,l2):
        l2_copy=list(l2)
        counter=0
        for i in l1:
            if i in l2_copy:
                counter+=1
                l2_copy.remove(i)
        return counter

l1=[1,1,1]
l2=[1,2]
print count_common(l1,l2)

1个

使用集合是最有效的,但是您始终可以执行r = [i for i in l1 if i in l2]

相关问题 更多 >