192
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Nói rằng tôi có danh sách này ở đây:
list = [a, b, c, d, e, f, g]
Làm thế nào tôi có thể xóa các chỉ mục nói
del my_list[2:6]
5 và del my_list[2:6]
6 cùng một lúc?POP không chấp nhận nhiều giá trị. Làm thế nào khác tôi làm điều này?
Một noa
3451 Huy hiệu vàng3 Huy hiệu bạc10 Huy hiệu đồng1 gold badge3 silver badges10 bronze badges
Đã hỏi ngày 3 tháng 7 năm 2012 lúc 1:06Jul 3, 2012 at 1:06
0
Bạn cần phải làm điều này trong một vòng lặp, không có hoạt động tích hợp để xóa một số chỉ mục cùng một lúc.
Ví dụ của bạn thực sự là một chuỗi các chỉ mục liền kề, vì vậy bạn có thể làm điều này:
del my_list[2:6]
trong đó loại bỏ lát cắt bắt đầu từ 2 và kết thúc ngay trước 6.
Không rõ ràng từ câu hỏi của bạn liệu nói chung bạn có cần xóa một bộ sưu tập các chỉ mục tùy ý hay nếu nó sẽ luôn là một chuỗi tiếp giáp.
Nếu bạn có một bộ sưu tập các chỉ mục tùy ý, thì:
indexes = [2, 3, 5]
for index in sorted[indexes, reverse=True]:
del my_list[index]
Lưu ý rằng bạn cần xóa chúng theo thứ tự ngược lại để bạn không loại bỏ các chỉ mục tiếp theo.
Đã trả lời ngày 3 tháng 7 năm 2012 lúc 1:08Jul 3, 2012 at 1:08
Ned Batchelderned BatchelderNed Batchelder
352K71 Huy hiệu vàng552 Huy hiệu bạc650 Huy hiệu Đồng71 gold badges552 silver badges650 bronze badges
7
remove_indices = [1,2,3]
somelist = [i for j, i in enumerate[somelist] if j not in remove_indices]
Example:
In [9]: remove_indices = [1,2,3]
In [10]: somelist = range[10]
In [11]: somelist = [i for j, i in enumerate[somelist] if j not in remove_indices]
In [12]: somelist
Out[12]: [0, 4, 5, 6, 7, 8, 9]
Đã trả lời ngày 3 tháng 7 năm 2012 lúc 1:09Jul 3, 2012 at 1:09
Igor Chubinigor ChubinIgor Chubin
58.7K10 Huy hiệu vàng117 Huy hiệu bạc138 Huy hiệu đồng10 gold badges117 silver badges138 bronze badges
2
Không có nhiều gợi ý về hiệu suất cho các cách khác nhau vì vậy tôi đã thực hiện một bài kiểm tra về việc loại bỏ 5000 mục từ 50000 trong cả 3 cách tiếp cận khác nhau và đối với tôi Numpy là người chiến thắng [nếu bạn có các yếu tố phù hợp với Numpy]:
- 7.5 giây cho danh sách được liệt kê hiểu [4,5 giây trên một PC khác]
- 0,08 giây để xóa các mục theo thứ tự ngược lại [0,017 [!] Giây]
- 0,009 giây cho numpy.delete [0,006 giây]
Đây là mã tôi đã tính thời gian [trong chuyển đổi hàm thứ ba từ/sang danh sách có thể bị xóa nếu làm việc trực tiếp trên các mảng numpy là OK]:
import time
import numpy as np
import random
def del_list_indexes[l, id_to_del]:
somelist = [i for j, i in enumerate[l] if j not in id_to_del]
return somelist
def del_list_inplace[l, id_to_del]:
for i in sorted[id_to_del, reverse=True]:
del[l[i]]
def del_list_numpy[l, id_to_del]:
arr = np.array[l, dtype='int32']
return list[np.delete[arr, id_to_del]]
l = range[50000]
random.shuffle[l]
remove_id = random.sample[range[len[l]], 5000] # 10% ==> 5000
# ...
Đã trả lời ngày 10 tháng 12 năm 2016 lúc 20:09Dec 10, 2016 at 20:09
AndrisandrisAndris
8537 Huy hiệu bạc14 Huy hiệu đồng7 silver badges14 bronze badges
2
Nếu bạn có thể sử dụng Numpy, thì bạn có thể xóa nhiều chỉ số:
>>> import numpy as np
>>> a = np.arange[10]
>>> np.delete[a,[1,3,5]]
array[[0, 2, 4, 6, 7, 8, 9]]
Và nếu bạn sử dụng
del my_list[2:6]
7, bạn có thể kết hợp các lát với các chỉ số riêng lẻ:>>> np.delete[a,[np.r_[0:5,7,9]]]
array[[5, 6, 8]]
Tuy nhiên, việc xóa không phải là
del my_list[2:6]
8, vì vậy bạn phải gán cho nó.Đã trả lời ngày 3 tháng 7 năm 2012 lúc 9:22Jul 3, 2012 at 9:22
Fraxelfraxelfraxel
33.5K11 Huy hiệu vàng95 Huy hiệu bạc99 Huy hiệu đồng11 gold badges95 silver badges99 bronze badges
Nếu họ tiếp giáp, bạn có thể làm
x[2:6] = []
Nếu bạn muốn xóa các chỉ mục không liên tục, thì đó là một chút khó khăn hơn.
x = [v for i,v in enumerate[x] if i not in frozenset[[2,3,4,5]]]
Levon
Huy hiệu vàng 132K3333 gold badges198 silver badges187 bronze badges
Đã trả lời ngày 3 tháng 7 năm 2012 lúc 1:08Jul 3, 2012 at 1:08
Ned Batchelderned BatchelderAntimony
352K71 Huy hiệu vàng552 Huy hiệu bạc650 Huy hiệu Đồng10 gold badges100 silver badges103 bronze badges
3
del my_list[2:6]
0Đã trả lời ngày 3 tháng 7 năm 2012 lúc 1:09
Igor Chubinigor ChubinDec 12, 2016 at 9:34
6
58.7K10 Huy hiệu vàng117 Huy hiệu bạc138 Huy hiệu đồng
del my_list[2:6]
1Không có nhiều gợi ý về hiệu suất cho các cách khác nhau vì vậy tôi đã thực hiện một bài kiểm tra về việc loại bỏ 5000 mục từ 50000 trong cả 3 cách tiếp cận khác nhau và đối với tôi Numpy là người chiến thắng [nếu bạn có các yếu tố phù hợp với Numpy]:Jul 2, 2017 at 14:16
7.5 giây cho danh sách được liệt kê hiểu [4,5 giây trên một PC khác]Lars
0,08 giây để xóa các mục theo thứ tự ngược lại [0,017 [!] Giây]2 gold badges13 silver badges25 bronze badges
0,009 giây cho numpy.delete [0,006 giây]
Đây là mã tôi đã tính thời gian [trong chuyển đổi hàm thứ ba từ/sang danh sách có thể bị xóa nếu làm việc trực tiếp trên các mảng numpy là OK]:
del my_list[2:6]
2Đã trả lời ngày 10 tháng 12 năm 2016 lúc 20:09the indexes of elements you want to pop. It's robust enough that the order of the list doesn't matter.
del my_list[2:6]
3Andrisandris
8537 Huy hiệu bạc14 Huy hiệu đồng
Nếu bạn có thể sử dụng Numpy, thì bạn có thể xóa nhiều chỉ số:
4del my_list[2:6]
Và nếu bạn sử dụng
7, bạn có thể kết hợp các lát với các chỉ số riêng lẻ:del my_list[2:6]
Tuy nhiên, việc xóa không phải là
8, vì vậy bạn phải gán cho nó.del my_list[2:6]
Đã trả lời ngày 3 tháng 7 năm 2012 lúc 9:22
Fraxelfraxel
33.5K11 Huy hiệu vàng95 Huy hiệu bạc99 Huy hiệu đồng
Nếu họ tiếp giáp, bạn có thể làm
Nếu bạn muốn xóa các chỉ mục không liên tục, thì đó là một chút khó khăn hơn.
Levon
Huy hiệu vàng 132K33
Nếu bạn muốn xóa các chỉ mục không liên tục, thì đó là một chút khó khăn hơn.
Levon
Huy hiệu vàng 132K33
AntinonionantimonJul 7, 2016 at 19:48