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

2024-06-08 23:22:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如:

我试过了

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

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

例如:

for x in xrange(1000):
    for y in xrange(0:100):
        v[x][y]=1
        print v

我希望这个“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](注意:我没有运行整个循环)

后来我试过了

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

完成了我想要的手术,效果很好,但花费的时间很长。有人能告诉我为什么第一个案子不起作用吗。还请让我知道生成重复列表列表的有效方法,并在不影响其他列表的情况下执行这些操作

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


Tags: 方法in元素内容列表for时间情况
1条回答
网友
1楼 · 发布于 2024-06-08 23:22:24
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[:]copy来制作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)

相关问题 更多 >