Python中的循环结构

时间:2012-07-17 20:45:50

标签: python

我是一个python noob并且在设置一个循环时遇到问题,该循环检查int z是否可以被一组数字整除,例如我写了下面的代码片段,但它们都返回X = [z的所有数字] ...即它们无法应用if条件,以便在给定范围内的所有n上检查mod /组。

X = []
z = 1
while z in range(1,1000):
    if all(z % n == 0 for n in range(1,21)):
        X.append(z) 
    z += 1

也尝试过:

X = []
if all(i % n == 0 for n in range(1,21)):
    X.append(i)

X = []
for z in range(1,1000000):
    if all(z % n == 0 for n in range(1,21)):
        X.append(z)  

知道这些(或至少1个)这些案件中的每一个都出了什么问题吗? 谢谢你的帮助!

6 个答案:

答案 0 :(得分:1)

编辑:错了,修正了答案。

你正在使用numpy吗? numpy和它的版本都有一些有趣的事情。

import numpy as np
all( z % n for n in range(1,5)) # NameError
np.all( z % n for n in range(1,5)) # True
z = 5
all( z % n for n in range(1,5)) # False
np.all( z % n for n in range(1,5)) # True
np.all([z % n for n in range(1,5)) # False

答案 1 :(得分:0)

问题不在于Python,而在于你的数学问题。如果x小于n,则x % n == x。特别是,没有小于21的整数可以是每个数字为零的模数,​​最多为21. 3 % 18是3.所以你需要重新考虑你所要求的。如果你真的试图找到一个可以被1到21之间的每个数字整除的数字,那么你得到的唯一数字就是数字很大(例如21!)。

答案 2 :(得分:0)

print [z for z in range(10000) if all(z%k==0 for k in range(1,10))]
>>> [0, 2520, 5040, 7560]

似乎有效。第二个例子,我似乎没有被初始化。第三种似乎有效。

PS:请注意,事实(21)相当大,肯定大于1000000 - 这不是一个完美的结果,但它可能比第一个答案低一两倍(素数分解yadda yadda)

答案 3 :(得分:0)

在你的第一个例子中,你正在进行一段时间和for循环的奇怪组合,我对它的运行感到有些惊讶!

在第二个示例中,您没有初始化或更新i

第三个例子有效。但是,第一个可被1到20的所有数字整除的数字是232792560,超出了你的范围。

作为替代方案,您也可以在一行中完成

X = [z for z in range(1, 1000000) if all(z % n == 0 for n in range(1, 21))]

但同样,你不会得到232792560以下的任何结果!

答案 4 :(得分:0)

首先,所有数字都可被1整除,甚至为零。所以你的范围(1,21)应该可以通过范围(2,21)

排除1
x % 1 == 0 
如果x>

始终为True 0并且是一个整数。

然后澄清: 如果你有:

rangeOne = range(1,1000000)
rangeTwo = range(2,21)

其次,您是否只关注rangeOne中可以被rangeTwo中的所有数字整除的数字?

或者您是否正在寻找rangeOne中可能的素数的子集,这样您就可以得到一个数字列表,这些数字不能被rangeTwo中的任何数字整除(结果整数除以分数)?

或者相反,来自rangeOne的所有数字都可以被rangeTwo中的任何一个或多个数字整除,这意味着排除素数。

还有更多这样的案例。

答案 5 :(得分:0)

首先,实际需要检查任何int z以获得可分性的集合小于N范围1-N。原因如下: 任何可被6整除的数字x也可以被它的因子1,2,3,6整除。

基本上,你的算法是:

for number in rangeArray:
     removeSubList(getAllFactors(number),rangeArray)

翻译成python代码:

#Note: this can be sped up even faster by appending both the multiples 
#at the same time instead of iterating over the range 1,number
#Note: get_all_factors(6) will return [1,2,3] but not [1,2,3,6]
def get_all_smaller_factors(number):
   factors = [number,1] 
   for x in range(1,number):
       if (number % x == 0 and number not in factors):
           factors.append(x)
   return factors


#Note: again, I'm too tired to find proper names, please improve later.
def min_factor_list(max):
    factors = range(1,max)
    for factor in factors:
        #remove the sublist you get from get_all_factors
        factors = [x for x in factor if x not in get_all_smaller_factors(x)] 
    return factors

#Note: again, I'm too tired to find proper names, please improve later.
def accept(input_var, range):
    factors = min_factor_list(range)
    for factor in factor:
         if(input_var % factor is not 0):
            return false

    return true

现在你已经完成了无聊的工作,这里有一个简单的oneliner可以完成你的工作:

 print "Is %d divisible by range(1,%d)? %r"%(z,max,accept(z,max))

免责声明:我实际上没有尝试过代码,但这应该可以使用。

编辑: 另一种(不完全不相关但肯定更好)的方法是使用范围(1..range_max)并找到最小公倍数(即LCM)。从那里,您只需检查LCM是否是Z的因素。

min_factor_list方法应该对此有所帮助。您可以简单地将该列表中的每个元素相乘并得到LCM(列表中没有元素将其他元素作为其因子或简单地放置,所有元素都是相对素数)

为什么这样做?因为Z必须至少LCM一样大。现在下一次你得到一个可以被所有数字整除的数字是什么?这与LCM*2同时发生。那之后的下一次? LCM*3