Getting the last element of a list

后端 未结 12 1276
一向
一向 2020-11-22 04:58

In Python, how do you get the last element of a list?

相关标签:
12条回答
  • 2020-11-22 05:46

    some_list[-1] is the shortest and most Pythonic.

    In fact, you can do much more with this syntax. The some_list[-n] syntax gets the nth-to-last element. So some_list[-1] gets the last element, some_list[-2] gets the second to last, etc, all the way down to some_list[-len(some_list)], which gives you the first element.

    You can also set list elements in this way. For instance:

    >>> some_list = [1, 2, 3]
    >>> some_list[-1] = 5 # Set the last element
    >>> some_list[-2] = 3 # Set the second to last element
    >>> some_list
    [1, 3, 5]
    

    Note that getting a list item by index will raise an IndexError if the expected item doesn't exist. This means that some_list[-1] will raise an exception if some_list is empty, because an empty list can't have a last element.

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

    In Python, how do you get the last element of a list?

    To just get the last element,

    • without modifying the list, and
    • assuming you know the list has a last element (i.e. it is nonempty)

    pass -1 to the subscript notation:

    >>> a_list = ['zero', 'one', 'two', 'three']
    >>> a_list[-1]
    'three'
    

    Explanation

    Indexes and slices can take negative integers as arguments.

    I have modified an example from the documentation to indicate which item in a sequence each index references, in this case, in the string "Python", -1 references the last element, the character, 'n':

     +---+---+---+---+---+---+
     | P | y | t | h | o | n |
     +---+---+---+---+---+---+
       0   1   2   3   4   5 
      -6  -5  -4  -3  -2  -1
    
    >>> p = 'Python'
    >>> p[-1]
    'n'
    

    Assignment via iterable unpacking

    This method may unnecessarily materialize a second list for the purposes of just getting the last element, but for the sake of completeness (and since it supports any iterable - not just lists):

    >>> *head, last = a_list
    >>> last
    'three'
    

    The variable name, head is bound to the unnecessary newly created list:

    >>> head
    ['zero', 'one', 'two']
    

    If you intend to do nothing with that list, this would be more apropos:

    *_, last = a_list
    

    Or, really, if you know it's a list (or at least accepts subscript notation):

    last = a_list[-1]
    

    In a function

    A commenter said:

    I wish Python had a function for first() and last() like Lisp does... it would get rid of a lot of unnecessary lambda functions.

    These would be quite simple to define:

    def last(a_list):
        return a_list[-1]
    
    def first(a_list):
        return a_list[0]
    

    Or use operator.itemgetter:

    >>> import operator
    >>> last = operator.itemgetter(-1)
    >>> first = operator.itemgetter(0)
    

    In either case:

    >>> last(a_list)
    'three'
    >>> first(a_list)
    'zero'
    

    Special cases

    If you're doing something more complicated, you may find it more performant to get the last element in slightly different ways.

    If you're new to programming, you should avoid this section, because it couples otherwise semantically different parts of algorithms together. If you change your algorithm in one place, it may have an unintended impact on another line of code.

    I try to provide caveats and conditions as completely as I can, but I may have missed something. Please comment if you think I'm leaving a caveat out.

    Slicing

    A slice of a list returns a new list - so we can slice from -1 to the end if we are going to want the element in a new list:

    >>> a_slice = a_list[-1:]
    >>> a_slice
    ['three']
    

    This has the upside of not failing if the list is empty:

    >>> empty_list = []
    >>> tail = empty_list[-1:]
    >>> if tail:
    ...     do_something(tail)
    

    Whereas attempting to access by index raises an IndexError which would need to be handled:

    >>> empty_list[-1]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range
    

    But again, slicing for this purpose should only be done if you need:

    • a new list created
    • and the new list to be empty if the prior list was empty.

    for loops

    As a feature of Python, there is no inner scoping in a for loop.

    If you're performing a complete iteration over the list already, the last element will still be referenced by the variable name assigned in the loop:

    >>> def do_something(arg): pass
    >>> for item in a_list:
    ...     do_something(item)
    ...     
    >>> item
    'three'
    

    This is not semantically the last thing in the list. This is semantically the last thing that the name, item, was bound to.

    >>> def do_something(arg): raise Exception
    >>> for item in a_list:
    ...     do_something(item)
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
      File "<stdin>", line 1, in do_something
    Exception
    >>> item
    'zero'
    

    Thus this should only be used to get the last element if you

    • are already looping, and
    • you know the loop will finish (not break or exit due to errors), otherwise it will point to the last element referenced by the loop.

    Getting and removing it

    We can also mutate our original list by removing and returning the last element:

    >>> a_list.pop(-1)
    'three'
    >>> a_list
    ['zero', 'one', 'two']
    

    But now the original list is modified.

    (-1 is actually the default argument, so list.pop can be used without an index argument):

    >>> a_list.pop()
    'two'
    

    Only do this if

    • you know the list has elements in it, or are prepared to handle the exception if it is empty, and
    • you do intend to remove the last element from the list, treating it like a stack.

    These are valid use-cases, but not very common.

    Saving the rest of the reverse for later:

    I don't know why you'd do it, but for completeness, since reversed returns an iterator (which supports the iterator protocol) you can pass its result to next:

    >>> next(reversed([1,2,3]))
    3
    

    So it's like doing the reverse of this:

    >>> next(iter([1,2,3]))
    1
    

    But I can't think of a good reason to do this, unless you'll need the rest of the reverse iterator later, which would probably look more like this:

    reverse_iterator = reversed([1,2,3])
    last_element = next(reverse_iterator)
    
    use_later = list(reverse_iterator)
    

    and now:

    >>> use_later
    [2, 1]
    >>> last_element
    3
    
    0 讨论(0)
  • 2020-11-22 05:49

    Ok, but what about common in almost every language way items[len(items) - 1]? This is IMO the easiest way to get last element, because it does not require anything pythonic knowledge.

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

    The simplest way to display last element in python is

    >>> list[-1:] # returns indexed value
        [3]
    >>> list[-1]  # returns value
        3
    

    there are many other method to achieve such a goal but these are short and sweet to use.

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

    list[-1] will retrieve the last element of the list without changing the list. list.pop() will retrieve the last element of the list, but it will mutate/change the original list. Usually, mutating the original list is not recommended.

    Alternatively, if, for some reason, you're looking for something less pythonic, you could use list[len(list)-1], assuming the list is not empty.

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

    Here is the solution for your query.

    a=["first","middle","last"] # A sample list
    print(a[0]) #prints the first item in the list because the index of the list always starts from 0.
    print(a[-1]) #prints the last item in the list.
    print(a[-2]) #prints the last second item in the list.
    

    Output:

    >>> first
    >>> last
    >>> middle
    
    0 讨论(0)
提交回复
热议问题