2016-07-25 66 views
-5

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

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 
+2

看起来你要我们写一些代码您。尽管许多用户愿意为遇险的编码人员编写代码,但他们通常只在海报已尝试自行解决问题时才提供帮助。展示这一努力的一个好方法是包含迄今为止编写的代码,示例输入(如果有的话),期望的输出以及实际获得的输出(输出,回溯等)。您提供的细节越多,您可能会收到的答案就越多。检查[FAQ](http://stackoverflow.com/tour)和[如何提问](http://stackoverflow.com/questions/how-to-ask)。 – TigerhawkT3

+0

没有'itertools'?然后,我猜是循环时间。你有没有理由不使用'itertools'?或者更像是对自己的挑战? – pwnsauce

+2

1.使用itertools编写代码。 2.转到itertools文档。对于你使用的每个函数,找到“这个函数等价于下面的代码:”块。 3.将这些块复制到您的代码中。 – Kevin

回答

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为想要的字符串大小

1

我会强烈建议使用很好地建立和测试itertoolsstandard module。作为程序员,重新创建轮子决不是建议的。也就是说,我会先看看itertools中的product()函数。

至于不使用itertools(),这个问题本质上是一个笛卡尔乘积问题(正排列与重复允许)。这是递归帮助我们的地方!

方法中::下一个可能的解决

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循环重复次。然后,我们累积子解决方案的结果,追加到结果列表中。因此,如果我们使用作为我们的重复值,出扩大迭代跟踪这个问题看起来像以下:

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

这是一条评论,而不是答案。 –

+0

@JohnColeman新增了一个答案!希望你对downvote改变主意:D – ospahiu

+1

没问题 - 尽管你可能刚发布了一个新答案。哎呀 - 我甚至会赞扬它。 –

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)用0完成字符串,直到字符串的长度为n。

现在全部更换0,1由A,B分别为:

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]