Если вы хотите симметричную разность, используйте оператор ^
вместо -
def difference(list1, list2):
return list(set(list1) ^ set(list2))
Вот четыре оператора набора, которые объединяют два набора в один набор.
|
объединение : элементы в одном или обоих наборах
&
пересечение : только элементы, общие для обоих наборов
-
Разница : элементы в левом наборе, которые не в правом наборе
^
Симметричная разница : элементы в любом наборе, но не в обоих.
Я думаю, что это более читабельный способ написания функции
def symmetric_difference(a, b):
return {*a} ^ {*b}
(* для распаковки в наборах литералов требуется python 3.5 или более поздняя версия)
Возвращение набора вместоСписок делает это немного более понятным, что делает функция.Входными аргументами могут быть любые итерируемые типы, и так как набор является неупорядоченным типом данных, возврат набора делает очевидным, что любой порядок во входных данных не был сохранен.
>>> symmetric_difference(range(3, 8), [1,2,3,4])
{1, 2, 5, 6, 7}
>>> symmetric_difference('hello', 'world')
{'d', 'e', 'h', 'r', 'w'}