如何从列表列表中复制某些元素,以免影响复制列表中元素的值

时间:2019-03-22 19:02:51

标签: python

我要做的是根据某些条件将一个列表列表中的某些元素复制到另一个列表中,然后更改列表的原始列表。

arr = [[1,0,4],[1,2,65],[2,3,56],[11,14,34]]
brr = []

for x in range(0,len(arr)):
    if arr[x][1] < 10:
        brr.append(arr[x])
        arr[x][1] = 1000
print(brr)

O / P:

  

[[1,1000,4],[1,1000,65],[2,1000,56]]

在上面的示例中,我想将带有中间元素<10的所有列表复制到另一个列表brr中,然后将原始列表中的元素更改为较大的值。但是,当我更改原始列表中的值时,它也会更改第二个列表中的值

我知道,当我向brr附加arr [i]时,brr只是将指向列表的引用指针存储在arr中,因此,当这些地址的值更改时,它会在两个地方反映出来,

同样,如果我必须复制整个L-O-L,我可以使用Deepcopy来完成,但是如果有条件/条件的话,最好的方法是什么

3 个答案:

答案 0 :(得分:4)

这是复制列表的另一种方法,以及一种遍历列表的更蟒蛇的方式

arr = [[1, 0, 4], [1, 2, 65], [2, 3, 56], [11, 14, 34]]
brr = []

for x in arr:
    if x[1] < 10:
        brr.append(list(x))
        x[1] = 1000
print(brr)
# [[1, 0, 4], [1, 2, 65], [2, 3, 56]]

答案 1 :(得分:3)

from copy import deepcopy
#....
brr.append(deepcopy(arr[x]))

答案 2 :(得分:3)

您应该从要复制的 arr 中创建每个(内部)列表的深层副本。一种方法(这是写得最短的,因为有很多:检查[SO]: How to clone or copy a list?)是通过切片:

翻译成您的代码后,您应该替换

brr.append(arr[x])

作者

brr.append(arr[x][:])

注意:如果您希望通用/可扩展,则应该使用copy.deepcopy,因为如果arr[x]的元素之一本身就是自己,它也会起作用列表(当前情况并非如此)。