How to remove an element from a list by index

后端 未结 18 2929
闹比i
闹比i 2020-11-22 03:22

How do I remove an element from a list by index in Python?

I found the list.remove method, but say I want to remove the last element, how do I do this?

相关标签:
18条回答
  • 2020-11-22 04:00

    Use del and specify the index of the element you want to delete:

    >>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> del a[-1]
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8]
    

    Also supports slices:

    >>> del a[2:4]
    >>> a
    [0, 1, 4, 5, 6, 7, 8, 9]
    

    Here is the section from the tutorial.

    0 讨论(0)
  • 2020-11-22 04:02

    Generally, I am using the following method:

    >>> myList = [10,20,30,40,50]
    >>> rmovIndxNo = 3
    >>> del myList[rmovIndxNo]
    >>> myList
    [10, 20, 30, 50]
    
    0 讨论(0)
  • 2020-11-22 04:03

    Like others mentioned pop and del are the efficient ways to remove an item of given index. Yet just for the sake of completion (since the same thing can be done via many ways in Python):

    Using slices (this does not do in place removal of item from original list):

    (Also this will be the least efficient method when working with Python list, but this could be useful (but not efficient, I reiterate) when working with user defined objects that do not support pop, yet do define a __getitem__ ):

    >>> a = [1, 2, 3, 4, 5, 6]
    >>> index = 3 # Only positive index
    
    >>> a = a[:index] + a[index+1 :]
    # a is now [1, 2, 3, 5, 6]
    

    Note: Please note that this method does not modify the list in place like pop and del. It instead makes two copies of lists (one from the start until the index but without it (a[:index]) and one after the index till the last element (a[index+1:])) and creates a new list object by adding both. This is then reassigned to the list variable (a). The old list object is hence dereferenced and hence garbage collected (provided the original list object is not referenced by any variable other than a).

    This makes this method very inefficient and it can also produce undesirable side effects (especially when other variables point to the original list object which remains un-modified).

    Thanks to @MarkDickinson for pointing this out ...

    This Stack Overflow answer explains the concept of slicing.

    Also note that this works only with positive indices.

    While using with objects, the __getitem__ method must have been defined and more importantly the __add__ method must have been defined to return an object containing items from both the operands.

    In essence, this works with any object whose class definition is like:

    class foo(object):
        def __init__(self, items):
            self.items = items
    
        def __getitem__(self, index):
            return foo(self.items[index])
    
        def __add__(self, right):
            return foo( self.items + right.items )
    

    This works with list which defines __getitem__ and __add__ methods.

    Comparison of the three ways in terms of efficiency:

    Assume the following is predefined:

    a = range(10)
    index = 3
    

    The del object[index] method:

    By far the most efficient method. It works will all objects that define a __del__ method.

    The disassembly is as follows:

    Code:

    def del_method():
        global a
        global index
        del a[index]
    

    Disassembly:

     10    0 LOAD_GLOBAL     0 (a)
           3 LOAD_GLOBAL     1 (index)
           6 DELETE_SUBSCR   # This is the line that deletes the item
           7 LOAD_CONST      0 (None)
          10 RETURN_VALUE
    None
    

    pop method:

    It is less efficient than the del method and is used when you need to get the deleted item.

    Code:

    def pop_method():
        global a
        global index
        a.pop(index)
    

    Disassembly:

     17     0 LOAD_GLOBAL     0 (a)
            3 LOAD_ATTR       1 (pop)
            6 LOAD_GLOBAL     2 (index)
            9 CALL_FUNCTION   1
           12 POP_TOP
           13 LOAD_CONST      0 (None)
           16 RETURN_VALUE
    

    The slice and add method.

    The least efficient.

    Code:

    def slice_method():
        global a
        global index
        a = a[:index] + a[index+1:]
    

    Disassembly:

     24     0 LOAD_GLOBAL    0 (a)
            3 LOAD_GLOBAL    1 (index)
            6 SLICE+2
            7 LOAD_GLOBAL    0 (a)
           10 LOAD_GLOBAL    1 (index)
           13 LOAD_CONST     1 (1)
           16 BINARY_ADD
           17 SLICE+1
           18 BINARY_ADD
           19 STORE_GLOBAL   0 (a)
           22 LOAD_CONST     0 (None)
           25 RETURN_VALUE
    None
    

    Note: In all three disassembles ignore the last two lines which basically are return None. Also the first two lines are loading the global values a and index.

    0 讨论(0)
  • 2020-11-22 04:05

    It doesn't sound like you're working with a list of lists, so I'll keep this short. You want to use pop since it will remove elements not elements that are lists, you should use del for that. To call the last element in python it's "-1"

    >>> test = ['item1', 'item2']
    >>> test.pop(-1)
    'item2'
    >>> test
    ['item1']
    
    0 讨论(0)
  • 2020-11-22 04:07

    Or if multiple indexes should be removed:

    print([v for i,v in enumerate(your_list) if i not in list_of_unwanted_indexes])
    

    Of course then could also do:

    print([v for i,v in enumerate(your_list) if i != unwanted_index])
    
    0 讨论(0)
  • 2020-11-22 04:08

    You probably want pop:

    a = ['a', 'b', 'c', 'd']
    a.pop(1)
    
    # now a is ['a', 'c', 'd']
    

    By default, pop without any arguments removes the last item:

    a = ['a', 'b', 'c', 'd']
    a.pop()
    
    # now a is ['a', 'b', 'c']
    
    0 讨论(0)
提交回复
热议问题