2016-06-05 5 views
1
>>> a = [1,1,1,2,3,4,4] 
>>> b = [1,1,2,3,3,3,4] 

[1,1,2,3,4] 

Пожалуйста, обратите внимание, что это не тот же вопрос, как это: Python intersection of two lists keeping duplicates Потому что даже если есть три 1s в списке а, есть только два в списке Ь, так что результат должен иметь только два.Пересечение двух списков, включая дубликаты?

+0

Как это не дубликат? Вы понимаете определение пересечения? Проблема с этим вопросом заключается в том, что дубликаты второго списка были удалены с помощью 'set()' –

+0

, похоже, вам нужно работать с двумя шагами. 1) создать список с пересечением. 2) проверьте, присутствует ли номер в обоих списках, и если да, добавьте его в список с перекрестками –

ответ

6

Для этого можно использовать collections.Counter, что обеспечит самый низкий счет, найденный в любом списке для каждого элемента, когда вы перейдете на перекресток.

from collections import Counter 

c = list((Counter(a) & Counter(b)).elements()) 

Выходы:

[1, 1, 2, 3, 4] 
0

Это будет делать:

from itertools import chain 
list(chain.from_iterable([(val,)*min(a.count(val), b.count(val)) for val in (set(a) & set(b))])) 

Дает:

[1, 1, 2, 3, 4] 
0

Это также работает.

a = [1, 1, 1, 2, 3, 4, 4] 
b = [1, 1, 2, 3, 3, 3, 4] 
c = [] 
i, j = 0, 0 
while i < len(a) and j < len(b): 
    if a[i] == b[j]: 
     c.append(a[i]) 
     i += 1 
     j += 1 
    elif a[i] > b[j]: 
     j += 1 
    else: 
     i += 1 

print(c) # [1, 1, 2, 3, 4] 
0

Это также должно работать:

def list_intersect(lisA, lisB): 
    """ Finds the intersection of 2 lists including common duplicates""" 

    Iset = set(lisA).intersection(set(lisB)) 
    Ilis = [] 
    for i in Iset: 
     num = min(lisA.count(i), lisB.count(i)) 
     for j in range(num): 
      Ilis.append(i) 
    return Ilis 
Смежные вопросы