簡體   English   中英

從數組中減去元素

[英]Subtracting elements from array

因此,我試圖從數組中刪除元素,並對該數組進行一些計算。 問題是,我仍然想保留原始數組的副本,所以我創建了一個新數組,並為其分配了原始數組的值。 關鍵是,每當我打印出原始數組和新數組的長度時,它就給我相同的長度,但是卻給了我新數組的長度。 如何制作一個與'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))

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]

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]]

您不是要復制-是別名。 您給同一數組(第二個列表)命名。 嘗試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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM