Hướng dẫn how do i remove multiple indices from a list in python? - làm cách nào để xóa nhiều chỉ mục khỏi danh sách trong python?

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?

Hướng dẫn how do i remove multiple indices from a list in python? - làm cách nào để xóa nhiều chỉ mục khỏi danh sách trong python?

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

353K71 Huy hiệu vàng553 Huy hiệu bạc650 Huy hiệu Đồng71 gold badges553 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

Hướng dẫn how do i remove multiple indices from a list in python? - làm cách nào để xóa nhiều chỉ mục khỏi danh sách trong python?

Igor Chubinigor ChubinIgor Chubin

59K10 Huy hiệu vàng117 Huy hiệu bạc139 Huy hiệu Đồng10 gold badges117 silver badges139 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

8737 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 133K3333 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

353K71 Huy hiệu vàng553 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

Hướng dẫn how do i remove multiple indices from a list in python? - làm cách nào để xóa nhiều chỉ mục khỏi danh sách trong python?

6

59K10 Huy hiệu vàng117 Huy hiệu bạc139 Huy hiệu Đồng

del my_list[2:6]
1

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):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 badges26 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]
3

Andrisandris

8737 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ố:

del my_list[2:6]
4

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ẻ:

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: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 133K33

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 133K33

AntinonionantimonJul 7, 2016 at 19:48