Is there an algorithm to find unique combinations of 2 lists? 5 lists?

后端 未结 7 2400
醉话见心
醉话见心 2020-12-20 06:29

I have N Lists I\'d like to find unique combinations of. I\'ve written it out on my whiteboard and it all seems to have a pattern, I just haven\'t found it

7条回答
  •  北海茫月
    2020-12-20 06:52

    Perhaps you are looking for itertools.product:

    #!/usr/bin/env python
    import itertools
    a=[1,2]
    b=['a','b']
    c=[str(s)+str(t) for s,t in itertools.product(a,b)]
    print(c)
    ['1a', '1b', '2a', '2b']
    
    v=[1,'a']
    w=[1,'b']
    x=[1,'c']
    y=[1,'d']
    z=[1,'e']
    
    r=[''.join([str(elt) for elt in p]) for p in itertools.product(v,w,x,y,z)]
    print(r)
    # ['11111', '1111e', '111d1', '111de', '11c11', '11c1e', '11cd1', '11cde', '1b111', '1b11e', '1b1d1', '1b1de', '1bc11', '1bc1e', '1bcd1', '1bcde', 'a1111', 'a111e', 'a11d1', 'a11de', 'a1c11', 'a1c1e', 'a1cd1', 'a1cde', 'ab111', 'ab11e', 'ab1d1', 'ab1de', 'abc11', 'abc1e', 'abcd1', 'abcde']
    

    Note that product yields 2**5 elements. Is this what you want?

    itertools.product is in Python 2.6. For previous versions, you can use this:

    def product(*args, **kwds):
            '''
            Source: http://docs.python.org/library/itertools.html#itertools.product
            '''
            # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
            # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
            pools = map(tuple, args) * kwds.get('repeat', 1)
            result = [[]]
            for pool in pools:
                result = [x+[y] for x in result for y in pool]
            for prod in result:
                yield tuple(prod)
    

    Edit: As jellybean points out, the original question asks for unique sets. The above code will not produce unique sets if a,b,v,w,x,y, or z contain repeated elements. If this is an issue for you, then you can convert each list to a set before sending it to itertools.product:

    r=[''.join([str(elt) for elt in p]) for p in itertools.product(*(set(elt) for elt in (v,w,x,y,z)))]
    

提交回复
热议问题