Вы можете использовать понимание списка, которое проверяет, существуют ли элементы из a1
в установленной версии a2
. Поскольку списки не хешируются, мы можем использовать вместо них кортежи.
# Convert a2 elements to a set of tuples
a2_set = {tuple(sublst) for sublst in a2}
# Use a list comprehension to filter the elements from a1 that don't exist in a2
difference = [sublst for sublst in a1 if tuple(sublst) not in a2_set]
print(difference)
Вывод:
[[1, 4], [2, 5], [3, 6], [4, 7], [5, 8], [6, 9]]
Если нас не заботит порядок (наборы неупорядочены), мы можем преобразовать a1
и a2
для наборов кортежей и применить различие наборов с помощью a - b
или a.difference(b)
:
print(a1_set - a2_set)
# {(5, 8), (1, 4), (3, 6), (2, 5), (6, 9), (4, 7)}
print(a1_set.difference(a2_set))
# {(5, 8), (1, 4), (3, 6), (2, 5), (6, 9), (4, 7)}
Мы также можем превратить эти результаты во вложенные списки, используя списки:
print([list(tup) for tup in a1_set - a2_set])
# [[5, 8], [1, 4], [3, 6], [2, 5], [6, 9], [4, 7]]
print([list(tup) for tup in a1_set.difference(a2_set)])
# [[5, 8], [1, 4], [3, 6], [2, 5], [6, 9], [4, 7]]
Однако, если вам нужна симметрия c разница , как описано в документах:
Возвращает новый набор с элементами либо в наборе, либо в других, но не оба.
Мы можем вычислить симметрию c разность, используя a ^ b
или a.symmetric_difference(b)
:
a1_set = {tuple(sublst) for sublst in a1}
a2_set = {tuple(sublst) for sublst in a2}
print(a1_set ^ a2_set)
# {(5, 8), (6, 9), (1, 4), (4, 7), (3, 6), (2, 5)}
print(a1_set.symmetric_difference(a2_set))
# {(5, 8), (6, 9), (1, 4), (4, 7), (3, 6), (2, 5)}
Который также может быть преобразован из набора кортежей в вложено с использованием списков:
print([list(tup) for tup in a1_set ^ a2_set])
# [[5, 8], [6, 9], [1, 4], [4, 7], [3, 6], [2, 5]]
print([list(tup) for tup in a1_set.symmetric_difference(a2_set)])
# [[5, 8], [6, 9], [1, 4], [4, 7], [3, 6], [2, 5]]