从数组中减去元素

时间:2017-12-28 22:44:51

标签: python python-3.x list

所以我试图从数组中删除元素并使用此数组进行一些计算。问题是,我想保留原始数组的副本,所以我创建了一个新数组并为其分配了原始数组的值。问题是,每当我打印出原始数据和新数组的长度时,它给出了相同的长度,但它给了我新数组的长度。如何使用与' a'相同的值创建新数组,但不更改' a'

a = [2, 4, 5, 7, 8, 9]
b = []    
b = a    
for _ in range(2):
    m = min(b)
    b[:] = (x for x in b if x != m)

print(len(b))
print(len(a))

3 个答案:

答案 0 :(得分:4)

b = a只是创建一个引用现有列表对象的新变量。要制作列表的副本,您可以使用list()函数或列表切片:

b = list(a)
b = a[:]

也就是说,要从现有的列表中创建一个新的列表,过滤掉一些元素,你可以使用列表理解:

from heapq import nsmallest
m = nsmallest(2, a)
b = [x for x in a if x not in m]

答案 1 :(得分:1)

listlist[:]之间存在差异 阅读时,list是对原始列表的引用,list[:]浅表复制列表。

分配时,list(重新)绑定名称和list[:]切片分配,替换以前列表中的内容。

但是,如果list元素本身就是列表,即使list1 = list[:]也存在问题。考虑:

>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a[:]
>>> b[0].remove(2)
>>> b 
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 3], [4, 5, 6], [7, 8, 9]]

这是因为复制到b的每个列表元素本身就是一个列表,这种列表复制涉及与普通list1 = list2相同的问题。最简单的方法是以这种方式显式复制每个列表元素:

>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b=[[j for j in i] for i in a]   
>>> b
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b[0].remove(2)
>>> b
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

答案 2 :(得分:1)

你没有复制 - 你是别名。你给同一个数组(这是一个列表btw)的第二个名称。尝试b = a[:]这将复制它 - 仅在列表内容不可变时才有效。

如果您的列表包含其他列表,它将"复制"对该列表的引用,但不是嵌套列表内容 - 这将是deepcopy()。

如果你想删除最低的2,你也可以求助于排序和切片(你的列表已经排序,所以不需要排序)

a = [2, 4, 5, 7, 8, 9] 

b = a[2:] // slice, ignore first 2 entries which are the lowest 2 

c = sorted(a)[2:] // implicitly creates a new sorted list, ignore lowest 2

print(b)
print(c)

输出:

[5, 7, 8, 9]
[5, 7, 8, 9]