Python:迭代python类中的集合列表

时间:2014-05-10 11:15:41

标签: python set

我的代码中的问题是for在类模式中循环for i in self.sets:;问题是您可以看到输入V=set([1,2,3,4]),因此类模式中的for循环执行set枚举。

最初循环从i=set([1]开始[set([1]), set([2]), set([3]), set([4])]}并相应地枚举返回[set([1, 2]), set([1, 3]), set([1, 4])][set([1, 2, 3]), set([1, 2, 4])],最后返回`[set([1,2,3,4]] )]来自i = set([1])。

现在上面循环的问题是,它总是从i=set([1])开始,而不是它应该跳到i=set([2]), set([3]) etc.,每个枚举以每个元素的[set([1, 2, 3, 4])] for the above input V结束,从而产生所有可能的结果组合。

class pattern(object):
    def __init__(self,node,sets):
        self.node=node
        self.sets=sets


    def enum(self):

        for i in self.sets:
            L=[]
            print "i"
            print i
            for j in self.node:
                if i!=j:
                    if type(i) is int:
                        L.append(set([i])|set([j]))
                    else:   
                        if j not in i:
                            L.append(i|set([j]))    

            return L                

V=set([1,2,3,4])
U=[]
h=[]
num=0
for i in V:
    cnt=1
    for j in range(1,len(V)+1):
        if cnt==1 or U==list(V):
            U=[]
            for a in V:         
                U.append(set([a]))
            #print U
        else:
            p=pattern(V,U)
            h=p.enum()

上面的模式类必须在第一次调用时返回[set([1,2]),set([1,3]),set([1,4])]和[set([1] ,2,3]),第二次设置([1,2,4])]和第三次设置[设置([1,2,3,4])]如果你能观察它返回的全部是枚举1与其他数字,所以现在它应该枚举2与其他数字类似,如前1所做但它不考虑2或3或4,但每次它考虑1并返回sam结果如上

1 个答案:

答案 0 :(得分:0)

我相信你试图枚举集合V中所有元素的组合,而无需替换。您可以使用python库执行以下操作。

import itertools

def all_combinations(v):
    for i in range(len(v)):
        for c in itertools.combinations(v, i + 1):
            yield c

list(all_combinations([1,2,3,4]))

产量

[(1,),
 (2,),
 (3,),
 (4,),
 (1, 2),
 (1, 3),
 (1, 4),
 (2, 3),
 (2, 4),
 (3, 4),
 (1, 2, 3),
 (1, 2, 4),
 (1, 3, 4),
 (2, 3, 4),
 (1, 2, 3, 4)]