所以几乎第一组代码创建了一个2到10000000的素数列表。我正在尝试找到25000001的素数因子化。所以我希望它按列表中的每个数字除以25000001并将该数字返回给a列表从大到小。
n = 10000000
primes = list()
multiples = set()
for i in range(2, n+1):
if i not in multiples:
primes.append(i)
multiples.update(range(i*i, n+1, i))
def primeFactors(x, factors):
factorList = []
if (x % factors) == 0:
factorList.append(factors)
print(factorList)
primeFactors(25000001, primes)
答案 0 :(得分:3)
您可以使用列表理解:
factorList = [e for e in factors if x % e == 0]
部分
e for e in factors
将“迭代”factors
的元素,条件if x % e == 0
用于过滤元素。
答案 1 :(得分:1)
如果要根据x检查因子中的每个数字,则需要迭代
for n in factors: # iterate over the list
if x % n == 0: # check "n" each number in the list
factorList.append(n) # append n if the if statement is True
[1,2,3,4...] % 3
基本上就是你现在正在做的事情,而不是检查每个元素。
你可以通过列表理解来实现同样的目标:
factorList = [n for n in factors if x % n == 0]
for循环和列表理解都是等效的。
以您想要的格式打印出来:
print "{} = {}".format(x," * ".join(map(str,factorList)))
如果您打算打印数字,可以在循环或列表理解中使它们成为字符串:
[str(x) for x in factors if n % x == 0]
print "{} = {}".format(x," * ".join(factorList))
要使用join
,元素必须是字符串,因此我们必须使用str(x)
或使用map将每个int
转换为字符串。
答案 2 :(得分:0)
你在这里尝试做的事实际上是可行的,而不是列表。如果使用numpy数组,则可以将其放入算术表达式中,并自动在整个数组中广播它们:
>>> import numpy as np
>>> primes = np.array([2, 3, 5, 7, 11])
>>> 18 % primes
array([0, 0, 3, 4, 7])
>>> 18 % primes == 0
array([ True, True, False, False, False], dtype=bool)
>>> primes[18 % primes == 0]
array([2, 3])
这正是你想要做的,几乎就是你想要的方式 - 它的工作方式与你期望的一样。
这显然更简洁,而且几乎总是更有效率;更重要的是,它通常更具可读性。
如果您想查找重复因素怎么办?好吧,你可以对整个数组进行平方,然后对其进行立方体化,依此类推:
>>> primes[18 % (primes**2) == 0]
array([3])
>>> primes[18 % (primes**3) == 0]
array([])
或者,更有效率的是,您可以将工作限制为仅过滤掉的数组,并以更少的工作量获得相同的结果:
>>> factors = primes[18 % primes == 0]
>>> factors2 = factors[18 % (factors**2) == 0]
>>> factors2
array([3])