Odpowiedź zależy od pożądanej semantyki a - b
.
Jeśli chcesz tylko pierwsze elementy, a następnie krojenie jest naturalnym sposobem, aby to zrobić:
In [11]: a = [1, 2, 3]
In [12]: b = [4 , 5]
In [13]: ab = a + b
In [14]: ab[:len(a)]
Out[14]: [1, 2, 3]
Jeśli, z drugiej strony, że chcesz usunąć elementy pierwszej liście nie znalazł się w sekundę listy:
In [15]: [v for v in ab if v not in b]
Out[15]: [1, 2, 3]
drugi rodzaj działania jest bardziej naturalnie wyrażane przy użyciu zestawów:
In [18]: set(ab) - set(b)
Out[18]: set([1, 2, 3])
Należy zauważyć, że ogólnie nie zachowuje to kolejności elementów (ponieważ zestawy są nieuporządkowane). Jeżeli zamawiający jest ważne, a b
prawdopodobnie będzie długa, konwersja b
do zestawu może poprawić wydajność:
In [19]: bset = set(b)
In [20]: [v for v in ab if v not in bset]
Out[20]: [1, 2, 3]
słowników istnieje już jest „dodatkiem” działanie w miejscu. Nazywa się dict.update()
.
Jaki byłby wynik dla '[1, 2, 3, 1, 2, 1] - [1, 2]'? – JJJ
@Juhana Brilliant pytanie. Byłoby: [3]. – dublintech
Wtedy powiedziałbym, dlaczego nie "[3, 1, 2, 1]"? –