2015-10-16 3 views
31

Когда список Python, как известно, всегда содержит один элемент, есть способ получить к нему доступ, кроме: «Почему вы хотите, чтобы»Получение только элемента из одного элемента списка в Python?

mylist[0] 

Вы можете спросить. Любопытство. Кажется, есть альтернативный способ сделать все в Python.

+5

Возможны альтернативы, но обычно есть только один * очевидный способ сделать это - и в этом случае вы, кажется, уже нашли его. – ekhumoro

+0

если он * всегда * содержит один элемент, то, может быть, 'list' не лучший тип данных? –

+3

@ekhumoro: Я на самом деле частично к методу распаковки последовательности, потому что он проверяет предположение, что последовательность имеет только один элемент. 'mylist [0]' преуспевает, если у вас есть хотя бы один элемент, но не жалуется, если у вас на самом деле было 30 элементов. 'singleitem, = mylist' проверяет, что у вас есть ровно один элемент, не более, не меньше. – ShadowRanger

ответ

48

Последовательность распаковка:

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 

Явное использование протокола итератора:

singleitem = next(iter(mylist)) 

деструктивного поп:

singleitem = mylist.pop() 

Отрицательный индекс:

singleitem = mylist[-1] 

устанавливается с помощью одной итерации for (потому что переменная цикла остается доступной с последним значением, когда цикл завершается):

for singleitem in mylist: break 

многие другие (сочетающих или различных битов выше, или иным образом, опираясь на неявной итерации) , Но ты получил идею.

+3

Не стоит включать в главный ответ из-за безудержного безумия: Параметр распаковывается в одиночную функцию аргумента (выполняется как анонимная лямбда, которая возвращает значение для максимальной глупости): 'singleitem = (lambda x: x) (* mylist)' – ShadowRanger

+2

Первый один из них уникален тем, что он также поднимается, если в списке содержится более одного элемента. –

+6

Первый может также быть записан как '[singleitem] = mylist'. –

4

Я добавлю, что библиотека имеет инструмент, который возвращает один элемент из итерабельного.

from more_itertools import one 


iterable = ["foo"] 
one(iterable) 
# "foo" 

Кроме того, more_itertools.one вызывает ошибку, если итератор пуст или имеет более чем один элемент.

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) 
Смежные вопросы