Коли відомо, що список Python завжди містить один елемент, чи є спосіб отримати до нього інший доступ, крім:
mylist[0]
Ви можете запитати: "Чому ви хочете?". Допитливість одна. Здається, існує альтернативний спосіб зробити все в Python.
Коли відомо, що список Python завжди містить один елемент, чи є спосіб отримати до нього інший доступ, крім:
mylist[0]
Ви можете запитати: "Чому ви хочете?". Допитливість одна. Здається, існує альтернативний спосіб зробити все в Python.
list
не найкращий тип даних?
mylist[0]
вдається, коли у вас є хоча б один елемент, але не скаржиться, якщо у вас насправді було 30 елементів. singleitem, = mylist
перевіряє, що у вас є рівно один елемент, ні більше, ні менше.
Відповіді:
Розпакування послідовності:
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
Багато інших (поєднуючи або варіюючи біти вищезазначеного, або іншим чином покладаючись на неявну ітерацію), але ви розумієте ідею.
singleitem = (lambda x: x)(*mylist)
[singleitem] = mylist
.
[]
для розпакування послідовностей ( for [i, x] in enumerate(iterable):
веде мене до затишку), але так, у разі розпакування одного значення, кінцеву кому можна легко пропустити, і використання дужок виправдане з причин читабельності. Я додав його до відповіді. Дякую!
Додам, що в more_itertools
бібліотеці є інструмент, який повертає один елемент із ітеративного.
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)
more_itertools
є стороннім пакетом > pip install more-itertools