Я делаю модуль python, который требует много заданных манипуляций. Я пробовал много вещей, но я не преуспел. Во-первых, я имею дело с множествами в трех измерениях, а затем я использую itertools функцию продукта, чтобы сделать декартово произведение:Манипулирование многомерным множеством: маргинализация, расширение, членство
from itertools import product
# Marginal sets
x1 = set(['u1', 'd1'])
x2 = set(['u2', 'd2'])
x3 = set(['u3', 'd3'])
# Cartesian product of x1,x2,x3
X = set(product(x1,x2,x3))
>>> X
set([('d1', 'u2', 'u3'), ('u1', 'u2', 'u3'), ('u1', 'u2', 'd3'), ('d1', 'd2', 'u3'), ('u1', 'd2', 'd3'), ('d1', 'd2', 'd3'), ('u1', 'd2', 'u3'), ('d1', 'u2', 'd3')])
Я хотел бы расширить пересечение множеств таким образом, что она принимает следующее:
>>>set('d1') & X # Return elements of X containing 'd1'
set([('d1', 'u2', 'u3'), ('d1', 'd2', 'u3'), ('d1', 'd2', 'd3'), ('d1', 'u2', 'd3')])
А также следующее:
>>>set('d1','u2') & X # Return elements of X containing 'd1'
set([('d1', 'u2', 'u3'), ('d1', 'u2', 'd3')])
Я также хотел бы расширить снова декартово произведение, добавив новое измерение, например,
x4 = set(['u4', 'd4'])
Y = cartesianproduct(X,x4)
>>>Y
set([('u1', 'u2', 'u3', 'd4'), ('d1', 'd2', 'u3', 'd4'), ('u1', 'u2', 'u3', 'u4'), ('u1', 'u2', 'd3', 'u4'), ('d1', 'u2', 'u3', 'u4'), ('d1', 'd2', 'd3', 'u4'), ('d1', 'd2', 'u3', 'u4'), ('d1', 'd2', 'd3', 'd4'), ('u1', 'u2', 'd3', 'd4'), ('u1', 'd2', 'd3', 'd4'), ('d1', 'u2', 'd3', 'd4'), ('d1', 'u2', 'd3', 'u4'), ('u1', 'd2', 'u3', 'u4'), ('d1', 'u2', 'u3', 'd4'), ('u1', 'd2', 'd3', 'u4'), ('u1', 'd2', 'u3', 'd4')])
Наконец, я хотел бы, чтобы удалить измерение:
Z = remove(x3,X)
>>>Z
set([('d1', 'd2'), ('u1', 'u2'), ('u1', 'd2'), ('d1', 'u2')])
Я новичок в Python, и я чувствую, что я делаю это совершенно неправильно, смешивая списки, кортежи и наборы в неправильные способы, может быть ...
Пожалуйста нежный :)
Я редактировал оригинальный вопрос, я забыл упомянуть, что мне также нужно has_element (('d1', 'u2'), X) работать аналогичным образом ... –
@FelipeAguirre Обновлен ответ на работу с вашим требованием. Просто обратите внимание, что теперь вы не можете передать один аргумент, его нужно обернуть в итерируемый объект. Используйте обратные элементы для написания встроенного кода в комментариях \ 'this \' становится 'this'. – Hooked
Я не был достаточно ясен, ожидаемый вывод 'has_element (('d1', 'u2'), X)' должен возвращать элементы, которые имеют '' d1'' AND ''u2''. Ваше решение возвращает элементы, которые имеют '' d1'' OR ''u2'' –