Biorąc pod uwagę dwie listy, jaki jest najlepszy sposób na usunięcie skrzyżowania tych dwóch? Na przykład biorąc pod uwagę:

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

Chcę wrócić:

a = [2,3]
b = [5]
-1
Nathaniel Flath 25 czerwiec 2017, 01:17

3 odpowiedzi

Najlepsza odpowiedź

Załóżmy, że chcesz poradzić sobie z ogólnym przypadkiem (te same elementy wydają się więcej niż raz na każdej liście), tzw. Multiset .

Możesz użyć {x0}}:

from collections import Counter
intersection = Counter(a) & Counter(b)
multiset_a_without_common = Counter(a) - intersection
multiset_b_without_common = Counter(b) - intersection
new_a = list(multiset_a_without_common.elements())
new_b = list(multiset_b_without_common.elements())

Dla twoich wartości a b, otrzymasz:

a = [2,2,2,3]
b = [2,2,5]
new_a = [2, 3]
new_b = [5]

Należy pamiętać, że dla specjalnego przypadku każdego elementu pojawiające się dokładnie raz, możesz użyć standardowej { {X0}}, ponieważ sugerują inne odpowiedzi.

8
randomir 24 czerwiec 2017, 22:35
a = [2,2,2,3]
b = [2,2,5]
for i in list(b): #I call list() on b because otherwise I can't remove from it during the for loop.
    if i in a:
        a.remove(i)
        b.remove(i)

Wynik:

a = [2, 3]
b = [5]
0
doratheexplorer0911 24 czerwiec 2017, 22:59

Możesz pętli przez dwa listy i usunąć elementy, ponieważ znajdziesz punkt przecięcia:

a = [2, 2, 2, 3]
b = [2, 2, 5]
delete = []
for c in a:
    for n in b:
        if n == c:
            delete.append(c)
            delete.append(n)
            break
    a.remove(delete[0])
    b.remove(delete[1])
    delete = []
print a
print b

Wynik:

[2, 3]
[5]
1
Mohd 24 czerwiec 2017, 22:27