2015-10-30 9 views
5

Mam 3 listy i chcę znaleźć różnicę między 1/2 a 2/3 i wydrukować je.Jak znaleźć różnicę między 3 listami, które mogą mieć zduplikowane numery?

Oto mój kod:

n1 = [1,1,1,2,3] 
n2 = [1,1,1,2] # Here the 3 is not found ("3" is not present in n1 at all) 
n3 = [1,1,2] # here 1 is not found (there are fewer "1"s in n3 than in n2) 
for x in n1: 
    if x not in n2: 
     print x 
for m in n2: 
    if m not in n3: 
     print m 

ale ja dostać tylko 3 jako wyjście.

Jak ustawić wyjście 1 i 3? Próbowałem również użyć set s, ale wydrukowano ponownie tylko 3.

+1

@bkaf Ciekawe, które z tych rozwiązań dotyczy tutaj, ponieważ wszystkie one dotyczą korzystania z zestawów, co oczywiście nie ma zastosowania do tego pytania. – Jkdc

+0

Proszę mi pomóc lub powiedzieć, jak go rozwiązać lub w co szukam i dziękuję i szukam wiele razy –

+0

Próbuję używać zestawów i ten sam problem tylko wyjście 3 tylko –

Odpowiedz

6

Ponieważ wydaje się przejmować, ile razy element znajduje się w obu listach, trzeba albo usunąć dopasowane elementy z listy jesteś porównując z:

comp = n2[:] # make a copy 
for x in n1: 
    if x not in comp: 
     print x 
    else: 
     comp.remove(x) 
# output: 3 

lub użyć collections.Counter

from collections import Counter 
print Counter(n1) - Counter(n2) 
# output: Counter({3: 1}) 

który powie ci, które elementy w n1 nie są w n2 lub częściej można znaleźć w n1 niż w n2.

Tak więc, na przykład:

>>> Counter([1,2,2,2,3]) - Counter([1,2]) 
Counter({2: 2, 3: 1}) 
+0

Nie wiedziałem, że było '__sub__' dla' Obiekty przeciwnika. To całkiem miłe. – TigerhawkT3

-3

można użyć zestawu, aby znaleźć różnicę między listy.

print set(n1).difference(set(n2)) 
+2

To nie działa. Nie dostaniemy drugiego przypadku, w którym jest dodatkowe '1' w' n2' – SirParselot

+0

tak, zgadzam się. robi różnicę jako całość i nie uważa powtórzeń za wyjątkowy – saikumarm

Powiązane problemy