如何检查该数字是否可以被列表中的前一个数字整除?

时间:2013-05-17 15:12:27

标签: python list

所以我想查看列表中的数字是否可以被列表中的前一个数字整除(除了1),如果是,我想将该数字替换为0有人可以帮忙吗?我正试图自己做一个'Eratosthenes的筛子'算法!

所以L1=[1,2,3,4,5,6,7,8,9,10]

for i in range(len(L1)):
   for j in range(len(L1)):
        if L1[i]%L1[j]<>0:
            L1[i]= 0

并且L1不应该是:[1,2,3,0,5,0,7,0,0,0]

3 个答案:

答案 0 :(得分:3)

试试这个

L1 = [2, 3, 4, 5, 6, 7, 8, 9]
for i in range(len(L1)):
   for j in range(i):
       if L1[j] not in (0, 1) and L1[i] % L1[j] == 0:
           L1[i] = 0
           break

>>> print L1
[2, 3, 0, 5, 0, 7, 0, 0]

答案 1 :(得分:1)

def test(number, lst):
    for i in lst:
        if i not in (0, 1) and number % i == 0:
            return 0
    return number

data = [1, 2, 3, 4, 5, 6, 7, 8, 9]   
result = []
for i in range(len(data)):
    result.append(test(data[i], data[0:i]))
# Instead of the result = [] and a for-cycle, it is possible to use list-comprehension. 
# Thanks to dansalmo for the suggestion
result = [test(data[i], data[0:i]) for i in range(len(data))]

这很正常。它可能不是最短或最有效的代码,但我认为它非常清楚。我们为每个数据元素和每个相应的数据部分调用函数测试,我们需要检查它们的除数。该函数返回正确的值:0或数字,我们将其附加到结果列表中。

答案 2 :(得分:0)

有趣的问题..可能有很酷的数学技巧可以让这更容易错过,但无论如何..

使用itertools我们可以得到一个迭代器,返回所有n选择2个数字组合,然后根据您的条件测试每对数字并使用ifilter得到我们想要删除的数字:

from itertools import ifilter, combinations
nums = [1,2,3,4,5,6,7,8,9,10]
def mod(x):
    if 1 in x: return False
    if not max(x)%min(x): return True
seive = [max(x) for x in ifilter(mod,combinations(nums,2))]

这将为您提供要设置为零的数字。你得到的那些你可以把它们设置为零:

for num in nums:
    if num in seive:
        nums[nums.index(num)] = 0

或者您可以获得剩余数字的列表:

primes = [x for x in nums if x not in seive]