2017-06-23 225 views
0
def product(n,p=2): 
    productList = [] 
    for k in range(10**(n-1),10**n): 
     for kk in range(10**(n-1),10**n): 
      productList.append([k,kk,k*kk]) 
    return productList 

该函数应该返回包含2个n位数字乘积的列表。 如何制作一个返回p位数字产品的函数? 所以如果p = 4,它应该返回4个n位数字的乘积。循环递归

我认为你需要为这些东西嵌套for循环,但我不知道该怎么做。谢谢。

+0

在第5行中是否指'productList.append(...)'? – micsthepick

+0

@micsthepick,是的,谢谢你纠正我。 –

+0

你很快就要接近可能有点笨拙的列表大小。会使用numpy是可以接受的吗? – Billylegota

回答

2

我认为你正在努力实现的可递归来完成:

def recursive(n, p=2, prev=[]): 
    productList = [] 
    for k in range(10**(n-1),10**n): 
     if p == 1: 
      productList.append([k, k]) 
     else: 
      for product in recursive(n, p=p-1): 
       productList.append([k] + product[:-1] + [k*product[-1]]) 
    return productList 

你需要的所有产品是独一无二的,因为这会给(2 * 4 = 8),也为(4 * 2 = 8)?

+1

谢谢,这是我一直在寻找的解决方案! –

0

itertools.permutations方法非常适合您试图实现的目标。

首先生成一个可以使用的数字/数字列表。

digits = list(range(10 ** (n - 1), 10 ** n)) 

然后才能得到每个号码的p副本乘上列表中p

digits *= p 

最后,使用itertools以产生所有的排列(或组合)可能与p长度的列表。

for values in itertools.permutations(digits, p): 
    output.append([values, np.prod(values)]) 

成品功能如下所示:

import itertools 
import numpy as np 

def product(n, p=2): 
    output = [] 

    # Generate a list containing every possible digit. 
    digits = list(range(10 ** (n - 1), 10 ** n)) 

    # Multiply the list by <p> so that we have <p> copies of each digit. 
    digits *= p 

    # Iterate over each possible permutation of the digits. 
    for values in itertools.permutations(digits, p): 
     output.append([values, np.prod(values)]) 

    return output 

或者,使用numpy的和sympy可以使函数更快(在具有成本虽然输出是一个数组,而不是列表) 。
以下是更快速的numpy + sympy实现代码(需要引用)。

import numpy as np 
from sympy.utilities.iterables import multiset_permutations as perm 

def product2(n, p=2): 
    digits = np.arange(10 ** (n - 1), 10 ** n) 
    digits = np.repeat(digits, p) 

    permutations = list(perm(digits, size=p)) 
    output = np.zeros((len(permutations), n + 1)) 

    for i in range(len(permutations)): 
     for j in range(n): 
      output[i][j] = permutations[i][j] 
     output[i][-1] = np.prod(permutations[i]) 

    return output 
1

这在SymPy电池已经包括:

from sympy.utilities.iterables import subsets 
from sympy.core.mul import prod 
numbers = [1, 2, 3] # or whatever factors you want 
p = 2 # how many factors you want 
for n in subsets(numbers, p, repetition=True): 
    print(n + (prod(n),)) 

此输出

(1, 1, 1) 
(1, 2, 2) 
(1, 3, 3) 
(2, 2, 4) 
(2, 3, 6) 
(3, 3, 9) 

这是在CARTES(或产品)的不同,你不会得到排列的因素,例如后者也会给(2,1,2)一个(1,2,2)的置换。您可以在SymPy中使用help(subsets)了解更多关于子集的信息,如果您愿意,可以阅读源代码。