在python中生成除数数组的数组

时间:2014-03-07 08:52:04

标签: python arrays algorithm optimization sieve

我希望得到数字n的除数作为存储在第n个位置的主列表中的列表。例如长度为11的筛子,我想要筛子[6] == [2,3,6](忽略1)。我的代码不起作用,并以令人不愉快的方式让我感到惊讶:

sieve = [[]]*11

sieve[1] = [1]

for i in range(2,11):

    for j in range(i,11,i):

        sieve[j].append(i)

        print ("appended", i ," at sieve",j)
        # This check-print statement shows that it works fine until sieve is printed. 
print (sieve)

sieve[6] turns out to be : [2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10]

可以解释一下吗?

2 个答案:

答案 0 :(得分:4)

考虑这个例子:

>>> a = [[]] * 5
>>> a
[[], [], [], [], []]
>>> a[0].append(1)
>>> a
[[1], [1], [1], [1], [1]]

当您将sieve声明为列表的产品时,每个列表都是同一个对象,对一个列表所做的更改会反映在所有列表中。所以你需要解决这个问题。

sieve = [[] for _ in xrange(11)]

您当然可以通过使用列表理解来简化整个过程。

sieve = [[], [1], [2]] + [[j for j in xrange(2, i) if i%j == 0] for i in xrange(3, 11)]  # 0, 1, and 2 are special cases

答案 1 :(得分:2)

您拥有由术语[[]] * 11创建的相同数组的副本。因此,如果您修改其中一个内部数组, all 将以相同的方式进行修改。

您可以创建一个独立数组列表,例如[ [] for i in range(11) ]