Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 484
Pyderman Avatar asked Oct 16 '15 02:10

Pyderman


People also ask

How do you take one element from a list?

The remove() method removes the first matching element (which is passed as an argument) from the list. The pop() method removes an element at a given index, and will also return the removed item. You can also use the del keyword in Python to remove an element or slice from a list.

How do you select a specific item in a list Python?

To select elements from a Python list, we will use list. append(). We will create a list of indices to be accessed and the loop is used to iterate through this index list to access the specified element. And then we add these elements to the new list using an index.


2 Answers

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 

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 

Rampant insanity:

# But also the only 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) 

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

like image 185
ShadowRanger Avatar answered Oct 12 '22 07:10

ShadowRanger


I will add that the more_itertools library has a tool that returns one item from an iterable.

from more_itertools import one   iterable = ["foo"] one(iterable) # "foo" 

In addition, more_itertools.one raises an error if the iterable is empty or has more than one item.

iterable = [] one(iterable) # ValueError: not enough values to unpack (expected 1, got 0)  iterable = ["foo", "bar"] one(iterable) # ValueError: too many values to unpack (expected 1) 

more_itertools is a third-party package > pip install more-itertools

like image 31
pylang Avatar answered Oct 12 '22 06:10

pylang