itertools产品功能背后的概念

时间:2016-07-25 15:14:13

标签: python recursion itertools

所以基本上我想了解itertools中product()函数的概念。我的意思是收益和收益之间有什么不同。无论如何,这段代码都可以缩短。

    def product1(*args, **kwds):
        pools = map(tuple, args) * kwds.get('repeat', 1)
        n = len(pools)
        if n == 0:
            yield ()
            return
        if any(len(pool) == 0 for pool in pools):
            return
        indices = [0] * n
        yield tuple(pool[i] for pool, i in zip(pools, indices))
        while 1:
            for i in reversed(range(n)):  # right to left
                if indices[i] == len(pools[i]) - 1:
                    continue
                indices[i] += 1
                for j in range(i+1, n):
                    indices[j] = 0
                yield tuple(pool[i] for pool, i in zip(pools, indices))
                break
            else:
                return

3 个答案:

答案 0 :(得分:1)

我强烈建议您使用完善且经过测试的itertools standard module。作为程序员,重新发明轮子永远不是可取的。也就是说,我首先来看看itertools中的product()函数。

至于不使用itertools(),此问题基本上是笛卡儿产品问题( n-permutations允许重复)。这是递归帮助我们的地方!下面有一个可能的解决方案:

方法正文:

result = []
def permutations(alphabet, repeat, total = ''):
    if repeat >= 1:
        for i in alphabet:
            # Add the subsolutions.     
            permutations(alphabet, repeat - 1, total + i)  

    else:
        result.append(total)
    return result

当我们拨打permutations()

示例输出:

permutations('ab', 3) ->
$ ['aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bba', 'bbb']
permutations('ab', 3) ->
$ ['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa',
  'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 
  'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']
permutations('ab', 1) ->
$ ['a', 'b']

它是如何运作的?

此方法通过以递归方式嵌套for循环 repeat -times来工作。然后,我们累积子解决方案的结果,附加到结果列表。因此,如果我们使用 4 作为我们的重复值,那么此问题的扩展迭代跟踪将如下所示:

for i in alphabet:
    for j in alphabet:
        for k in alphabet:
            for l in alphabet:
                result.append(i + j + k + l)

答案 1 :(得分:0)

此代码应该完成工作:

bytes = [i for i in range(2**(n))]
AB= []
for obj in bytes:
    t = str(bin(obj))[2:]
    t= '0'*(n-len(t)) + t
    AB.append(t.replace('0','A').replace('1','B'))

n是想要的字符串大小

答案 2 :(得分:0)

首先创建一个包含所有可能安排的列表,这可以通过求和二进制文件轻松实现:

def generate_arrangements(n):
    return [bin(i)[2:].zfill(n) for i in range(2**n)]  # 2**n is number of possible options (A,B) n times

[2:]切割字符串并从中删除'0b',zfill(n)用0s完成字符串,直到字符串的长度为n。

现在分别用A,B替换所有0,1:​​

arrangements = [arrangement.replace('0', 'A').replace('1', 'B') for arrangement in generate_arrangements(3)]
print(arrangements)
>> ['AAA', 'AAB', 'ABA', 'ABB', 'BAA', 'BAB', 'BBA', 'BBB']

如果你想把所有人放在一起,你有:

def generateAB(n):
    arrangements = [bin(i)[2:].zfill(n) for i in range(2**n)]
    return [arrangement.replace('0', 'A').replace('1', 'B') for arrangement in arrangements]