Вы также можете использовать не заданный подход, используя collections.Counter
:
from itertools import chain
from collections import Counter
res = [k for k, v in Counter(chain(list1, list2, list3)).items() if v==1]
print(res)
#['a', 0]
Используйте itertools.chain
, чтобы сгладить списки вместе, и используйте Counter
, чтобы сосчитать вхождения. Храните только те, где количество равно 1.
Обновление : Вот лучший пример, который демонстрирует, почему другие методы не работают.
list1 = [1, 3, 2]
list2 = ["a", 1, 3]
list3 = [2, 0]
list4 = [1, 4]
all_lists = [list1, list2, list3, list4]
Правильный ответ на основании ваших критериев:
print([k for k, v in Counter(chain(*all_lists)).items() if v==1])
#['a', 4, 0]
Использование reduce(set.symmetric_difference, ...)
:
sets = map(set, all_lists)
print(reduce(set.symmetric_difference, sets))
#{0, 1, 4, 'a'}
Использование симметричной разности минус пересечение:
set1 = set(list1)
set2 = set(list2)
set3 = set(list3)
set4 = set(list4)
print((set1 ^ set2 ^ set3 ^ set4) - (set1 & set2 & set3 & set4))
#{0, 1, 4, 'a'}