生成相同列表的列表并在特定列表上执行不同的操作,而不会影响列表中的任何其他列表?

时间:2017-09-05 21:30:49

标签: python arrays list numpy

我必须生成一个包含非常大的10 ^ 5列表的列表列表,每个列表包含(10 ^ 5)个元素。稍后我需要在不同的列表上执行不同的操作。

例如:

我试过了

<Style/>

当我尝试对特定列表执行操作时,它会影响列表中的所有列表。

例如:

u=[0 for i in xrange(10^^5)]
v=[u for j in xrange(10^^5)]

我希望这个“print v”显示类似for x in xrange(1000): for y in xrange(0:100): v[x][y]=1 print v 的内容,但它恰好显示列表中所有列表的[[1,0,0...],[0,0,0...],[0,0,0],[]....10^^5 times](注意:我没有运行整个循环)

后来我尝试了

[[1,0,0...],[1,0,0...],[1,0,0],[1,0,0....]....10^^5 times]

并完成了我想要的操作。这个工作正常,但所用的时间非常长。任何人都可以让我知道为什么第一个案例不起作用。另请告诉我生成重复列表列表的有效方法,并在不影响其他列表的情况下执行这些操作

另外,请让我知道使用像numpy这样的库实现它的任何其他方法。

1 个答案:

答案 0 :(得分:0)

In [51]: u = [0 for i in range(5)]
In [52]: u
Out[52]: [0, 0, 0, 0, 0]
In [53]: v = [u for j in range(4)]
In [54]: v
Out[54]: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
In [55]: v[0][1]=2
In [56]: v
Out[56]: [[0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0]]

v有4个元素,每个元素都指向u。更改一个,它会全部更改,并且也会更改u

但如果我使用u[:]副本制作w,那么w的每个子列表都是唯一的。更改一个不会改变其他人,也不会改变u(或v):

In [57]: w = [u[:] for j in range(4)]
In [58]: w
Out[58]: [[0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0]]
In [59]: w[0][1]=4
In [60]: w
Out[60]: [[0, 4, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0]]
In [61]: u
Out[61]: [0, 2, 0, 0, 0]

构造w会更慢,并且会占用更多内存。但它应该比[[0 for i in range(5)] for j in range(4)]更快,并占用相同的内存量。

测试时间

In [62]: timeit [[0 for i in range(5)] for j in range(4)]
6.42 µs ± 99 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [63]: timeit w = [u[:] for j in range(4)]
2.24 µs ± 84.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [64]: timeit v = [u for j in range(4)]
1.23 µs ± 13.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)