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
在第5行中是否指'productList.append(...)'? – micsthepick
@micsthepick,是的,谢谢你纠正我。 –
你很快就要接近可能有点笨拙的列表大小。会使用numpy是可以接受的吗? – Billylegota