Search code examples
pythonlistiterable-unpacking

Getting only element from a single-element list in Python?


When a Python list is known to always contain a single item, is there a way to access it other than:

mylist[0]

You may ask, 'Why would you want to?'. Curiosity alone. There seems to be an alternative way to do everything in Python.


Solution

  • Raises exception if not exactly one item:

    Sequence unpacking:

    singleitem, = mylist
    # Identical in behavior (byte code produced is the same),
    # but arguably more readable since a lone trailing comma could be missed:
    [singleitem] = mylist
    

    Rampant insanity, unpack the input to the identity lambda function:

    # The only even semi-reasonable way to retrieve a single item and raise an exception on
    # failure for too many, not just too few, elements as an expression, rather than a
    # statement, without resorting to defining/importing functions elsewhere to do the work
    singleitem = (lambda x: x)(*mylist)
    

    All others silently ignore spec violation, producing first or last item:

    Explicit use of iterator protocol:

    singleitem = next(iter(mylist))
    

    Destructive pop:

    singleitem = mylist.pop()
    

    Negative index:

    singleitem = mylist[-1]
    

    Set via single iteration for (because the loop variable remains available with its last value when a loop terminates):

    for singleitem in mylist: break
    

    There are many others (combining or varying bits of the above, or otherwise relying on implicit iteration), but you get the idea.