php – 是否有算法可以找到2个列表的唯一组合? 5个名单?

我有N个列表我想找到独特的组合.我已经把它写在我的白板上了,它似乎都有一个模式,我还没有找到它.我觉得我可以表达一种蛮力的方法,这肯定是我追求的东西.还有其他选择吗?不同的数据结构(二叉树吗?)会使这样的工作更合适吗?

鉴于:

#    1  2
a = [1, 2]
b = [a, b]

结果将是:

c = [1a, 1b, 2a, 2b] # (4 unique combinations)

鉴于:

v = [1, a]
w = [1, b]
x = [1, c]
y = [1, d]
z = [1, e]

结果将是:

r = [11111, 1bcde, 11cde, 111de, 1111e, a1111, ab111, abc11, abcd1, abcde, 1b1d1, 1bc1e, 11c11, 11c1e, ... ] 

解决方法:

也许您正在寻找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']

请注意,产品产生2 ** 5个元素.这是你想要的吗?

itertools.product在Python 2.6中.对于以前的版本,您可以使用:

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)

编辑:正如果冻指出,原始问题要求独特的集合.如果a,b,v,w,x,y或z包含重复元素,则上述代码将不会生成唯一集合.如果这对您来说是个问题,那么您可以在将每个列表发送到一个集合之前将其转换为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)))]

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...