Как я могу протестировать несколько наборов для элементов, которые являются уникальными в Python? - PullRequest
0 голосов
/ 07 октября 2018

Я ищу способ найти уникальные предметы между несколькими наборами.Например, возьмите эти 3 комплекта.

x = {1, 2}
y = {1, 3}
z = {1, 3, 4, 5}

Как мне найти уникальные предметы?Я ищу что-то вроде этого.

findunique(x, y, z) # {2, 4, 5}

Я пытался использовать symmetric_difference с reduce, но это закончилось возвращением {1, 2, 4, 5}.

Единственное, что я могудумать о том, чтобы dict отслеживал, сколько отсчетов существует для каждого предмета, и возвращать только те, которые имеют 1 отсчет.Тем не менее, это выглядит очень неэффективно и не пифонично.Какой «правильный» способ пойти по этому поводу?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вы можете сгладить sets после преобразования их в один список, а затем отфильтровать его для элементов с количеством, равным 1.

lista = [x, y, z]
listb = [j for i in lista for j in i]
print(set(filter(lambda x: listb.count(x) == 1, listb)))
# {2, 4, 5}
0 голосов
/ 07 октября 2018

Объедините наборы в один список с chain.Посчитайте количество вхождений каждого элемента с помощью Counter.Выберите элементы, которые встречаются только один раз, и составьте их набор.

from collections import Counter
from itertools import chain

sets = x,y,z
{x for x, cnt in Counter(chain.from_iterable(sets)).items() if cnt==1}
#{2, 4, 5}

EDITED на основе комментариев @ jedwards.

...