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

Tho*_*mas 11 python list set

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

a=[2,2,1,1]
b=[1,1,3,3]
Run Code Online (Sandbox Code Playgroud)

设置(a)和设置(b)工作
a和b不起作用

有可能用套装和dictonary吗?

Mar*_*son 11

在Python 3.x(和Python 2.7,当它发布时),你可以使用collections.Counter:

>>> from collections import Counter
>>> list((Counter([2,2,1,1]) & Counter([1,3,3,1])).elements())
[1, 1]
Run Code Online (Sandbox Code Playgroud)

这是使用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
Run Code Online (Sandbox Code Playgroud)

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


Max*_*keh 8

使用集合是最有效的,但您可以随时使用r = [i for i in l1 if i in l2].