Reputation: 45
What I want to do is to copy some elements of one list-of-list to other based on certain conditions and then change the original list of lists
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]]
in the above example, I wanted to copy all the list with the middle element <10 to another list-of-list brr
and then change the element in the original list to a large value. However, when I change a value in the original list it also changes the value in the second list
I know that when I append arr[i] to brr, brr just stores the reference pointers to the lists in arr and hence when the values at those addresses are changed it reflects at both the places,
also, if I had to copy the entire l-o-l I could have done it with deepcopy, but what is the best way to do it if there is a criteria /condition
Upvotes: 2
Views: 1166
Reputation: 41137
You should create a deep copy of each (inner) list from arr that you want to copy. One way (which is the shortest to write, as there are numerous: check [SO]: How to clone or copy a list?), is via slicing:
Translated to your code, you should replace
brr.append(arr[x])
by
brr.append(arr[x][:])
Note: If you want to be generic / scalable, you should go for copy.deepcopy
, as it would also work if one of arr[x]
's elements wold be itself a list (which currently isn't the case).
Upvotes: 3
Reputation: 3662
Here's another way of copying lists, along with a more pythonic way of iterating through a list
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]]
Upvotes: 4