2

我正在做一个需要大量集合操作的 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 新手,我觉得我做错了,可能以错误的方式混合列表、元组和集合......

请温柔:)

4

1 回答 1

2

我会使用一组列表来代替:

X = map(set,product(x1,x2,x3))

def has_element(X,Y):
    return [y for y in Y if len(y.intersection(X))]

print has_element(['d1','u1'],X)

>>> [set(['d2', 'u1', 'd3']), set(['d2', 'u1', 'u3']), set(['u1', 'd3', 'u2']), set(['u1', 'u3', 'u2']), set(['d2', 'd3', 'd1']), set(['d2', 'u3', 'd1']), set(['u2', 'd3', 'd1']), set(['u2', 'u3', 'd1'])]

对于您的第二个功能:

def new_product(X,Y):
    Z = []
    for a,b in product(X,Y):
        ab = b.copy()
        ab.add(a)
        Z.append(ab)
    return Z

print new_product(set(['d4','u4']),X)

>>> [set(['u1', 'd2', 'd3', 'u4']), set(['u1', 'd2', 'u3', 'u4']), set(['u4', 'u1', 'd3', 'u2']), set(['u4', 'u1', 'u3', 'u2']), set(['u4', 'd2', 'd3', 'd1']), set(['u4', 'd2', 'u3', 'd1']), set(['u4', 'd1', 'd3', 'u2']), set(['u4', 'd1', 'u3', 'u2']), set(['u1', 'd4', 'd2', 'd3']), set(['u1', 'd4', 'd2', 'u3']), set(['d4', 'u1', 'd3', 'u2']), set(['d4', 'u1', 'u3', 'u2']), set(['d4', 'd2', 'd3', 'd1']), set(['d4', 'd2', 'u3', 'd1']), set(['d4', 'd1', 'd3', 'u2']), set(['d4', 'd1', 'u3', 'u2'])]

最终功能:

def remove(X,Y):
    Z = Y[:] # Make a copy
    for z in Z:
        for x in X:
            if x in z:
                z.remove(x)
    return Z

print remove(x3,X)

>>> [set(['d2', 'd1']), set(['d2', 'd1']), set(['u2', 'd1']), set(['u2', 'd1'])]
于 2013-09-24T13:52:14.463 回答