Jestem trochę utknął na tym:

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

Chcę porównać dwie listy i wygenerować listę z tymi samymi przedmiotami, co a, ale z dowolnymi elementami, które nie występują w b ustawione na 0. Prawidłowe wyjścia byłyby to:

c = [0,2,0,0,0,5]
# or
c = [0,0,0,2,0,5]

Nie znałbym wcześniej elementów liczbowych na żadnej liście.

Próbowałem for pętli, ale

['0' for x in a if x not in b]

Usuwa wszystkie instancje 2., które chcę tylko raz usunąć (wystąpi raz w b na chwilę). Muszę dodać stan w powyższym loop, aby zachować elementy pasujące.

3
Sid 5 czerwiec 2018, 13:46

3 odpowiedzi

Najlepsza odpowiedź

Pracuje:

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

output = []

for x in a:
    if x in b:
        b.remove(x)
        output.append(x)
    else:
        output.append(0)

Lub dla jednej liniowej, używając faktu, że b.remove(x) zwraca None:

a = [1,2,3,2,4,5]
b = {2, 5}

output = [(b.remove(x) or x) if x in b else 0 for x in a]
4
Jacques Gaudin 5 czerwiec 2018, 11:50

Jeśli elementy w b są wyjątkowe, najlepiej jest to zrobić za pomocą set, ponieważ zestawy umożliwiają bardzo wydajne badania członkostwa:

a = [1,2,3,2,4,5]
b = {2, 5}  # make this a set

result = []
for num in a:
    # If this number occurs in b, remove it from b.
    # Otherwise, append a 0.
    if num in b:
        b.remove(num)
        result.append(num)
    else:
        result.append(0)

# result: [0, 2, 0, 0, 0, 5]

Jeśli b może zawierać duplikaty, możesz zastąpić zestaw za pomocą Counter, który reprezentuje multiset:

import collections

a = [1,2,3,2,4,5]
b = collections.Counter([2, 2, 5])

result = []
for num in a:
    if b[num] > 0:
        b[num] -= 1
        result.append(num)
    else:
        result.append(0)

# result: [0, 2, 0, 2, 0, 5]
2
Aran-Fey 5 czerwiec 2018, 11:29

Oto jeden sposób za pomocą set. W dół to operacja kopiowania list i konwersja set. Undeside to O (1) usuwanie i operacje wyszukiwania.

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

b_set = set(b)
c = a.copy()

for i in range(len(c)):
    if c[i] in b_set:
        b_set.remove(c[i])
    else:
        c[i] = 0

print(c)

[0, 2, 0, 0, 0, 5]
1
jpp 5 czerwiec 2018, 11:26