Câu trả lời:
Đối với một danh sách , bạn có thể sử dụng một comp danh sách. Ví dụ: để tạo bbản sao của akhông có phần tử thứ 3:
a = range(10)[::-1] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
b = [x for i,x in enumerate(a) if i!=3] # [9, 8, 7, 5, 4, 3, 2, 1, 0]
Điều này rất chung chung và có thể được sử dụng với tất cả các tệp lặp, bao gồm các mảng không có hạt. Nếu bạn thay thế []bằng (), bsẽ là một trình lặp thay vì một danh sách.
Hoặc bạn có thể làm điều này tại chỗ với pop:
a = range(10)[::-1] # a = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
a.pop(3) # a = [9, 8, 7, 5, 4, 3, 2, 1, 0]
Trong numpy, bạn có thể làm điều này với lập chỉ mục boolean:
a = np.arange(9, -1, -1) # a = array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
b = a[np.arange(len(a))!=3] # b = array([9, 8, 7, 5, 4, 3, 2, 1, 0])
nói chung sẽ nhanh hơn nhiều so với việc hiểu danh sách được liệt kê ở trên.
>>> l = range(1,10)
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[:2]
[1, 2]
>>> l[3:]
[4, 5, 6, 7, 8, 9]
>>> l[:2] + l[3:]
[1, 2, 4, 5, 6, 7, 8, 9]
>>>
Xem thêm
Cách đơn giản nhất mà tôi tìm thấy là:
mylist[:x]+mylist[x+1:]
điều đó sẽ tạo ra của bạn mylistmà không có phần tử tại chỉ mục x.
Nếu bạn đang sử dụng numpy, gần nhất, tôi có thể nghĩ đến là sử dụng mặt nạ
>>> import numpy as np
>>> arr = np.arange(1,10)
>>> mask = np.ones(arr.shape,dtype=bool)
>>> mask[5]=0
>>> arr[mask]
array([1, 2, 3, 4, 5, 7, 8, 9])
Một cái gì đó tương tự có thể đạt được sử dụng itertoolsmà không cầnnumpy
>>> from itertools import compress
>>> arr = range(1,10)
>>> mask = [1]*len(arr)
>>> mask[5]=0
>>> list(compress(arr,mask))
[1, 2, 3, 4, 5, 7, 8, 9]
np.arange(len(arr)) != 3mặt nạ, bởi vì sau đó nó có thể được nội dòng, ví dụ arr[~(np.arange(len(arr)) == 3)]hoặc bất cứ điều gì.
Sử dụng np.delete! Nó không thực sự xóa bất cứ thứ gì tại chỗ
Thí dụ:
import numpy as np
a = np.array([[1,4],[5,7],[3,1]])
# a: array([[1, 4],
# [5, 7],
# [3, 1]])
ind = np.array([0,1])
# ind: array([0, 1])
# a[ind]: array([[1, 4],
# [5, 7]])
all_except_index = np.delete(a, ind, axis=0)
# all_except_index: array([[3, 1]])
# a: (still the same): array([[1, 4],
# [5, 7],
# [3, 1]])
Tôi sẽ cung cấp một cách thực hiện chức năng (không thể thay đổi).
Cách làm tiêu chuẩn và dễ dàng là sử dụng phương pháp cắt lát:
index_to_remove = 3
data = [*range(5)]
new_data = data[:index_to_remove] + data[index_to_remove + 1:]
print(f"data: {data}, new_data: {new_data}")
Đầu ra:
data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]Sử dụng khả năng hiểu danh sách:
data = [*range(5)]
new_data = [v for i, v in enumerate(data) if i != index_to_remove]
print(f"data: {data}, new_data: {new_data}")
Đầu ra:
data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]Sử dụng chức năng bộ lọc:
index_to_remove = 3
data = [*range(5)]
new_data = [*filter(lambda i: i != index_to_remove, data)]
Đầu ra:
data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]Sử dụng mặt nạ. Tạo mặt nạ được cung cấp bởi hàm itertools.compress trong thư viện chuẩn:
from itertools import compress
index_to_remove = 3
data = [*range(5)]
mask = [1] * len(data)
mask[index_to_remove] = 0
new_data = [*compress(data, mask)]
print(f"data: {data}, mask: {mask}, new_data: {new_data}")
Đầu ra:
data: [0, 1, 2, 3, 4], mask: [1, 1, 1, 0, 1], new_data: [0, 1, 2, 4]Sử dụng hàm itertools.filterfalse từ thư viện chuẩn Python
from itertools import filterfalse
index_to_remove = 3
data = [*range(5)]
new_data = [*filterfalse(lambda i: i == index_to_remove, data)]
print(f"data: {data}, new_data: {new_data}")
Đầu ra:
data: [0, 1, 2, 3, 4], new_data: [0, 1, 2, 4]Lưu ý rằng nếu biến là danh sách danh sách, một số cách tiếp cận sẽ không thành công. Ví dụ:
v1 = [[range(3)] for x in range(4)]
v2 = v1[:3]+v1[4:] # this fails
v2
Đối với trường hợp chung, sử dụng
removed_index = 1
v1 = [[range(3)] for x in range(4)]
v2 = [x for i,x in enumerate(v1) if x!=removed_index]
v2
numpy.concatenate.