-2

所以我想看看列表中的数字是否可以被列表中的前一个数字整除(除了 1),如果是这样,我想用 0 替换那个数字有人可以帮忙吗?我正在尝试自己制作“埃拉托色尼筛”算法!

所以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]

4

3 回答 3

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]
于 2013-05-17T15:17:23.580 回答
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 或数字,我们将其附加到结果列表中。

于 2013-05-17T15:41:58.370 回答
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]
于 2013-05-17T16:57:09.700 回答