当已知Python列表始终包含单个项目时,除了以下方式之外,还有其他方法可以访问它:
mylist[0]
您可能会问,“为什么要这么做?”。仅凭好奇心。似乎有这样做的另一种方式都在Python。
当已知Python列表始终包含单个项目时,除了以下方式之外,还有其他方法可以访问它:
mylist[0]
您可能会问,“为什么要这么做?”。仅凭好奇心。似乎有这样做的另一种方式都在Python。
list
不是最佳数据类型?
mylist[0]
如果您至少拥有一个元素,则成功,但是如果您实际拥有30个元素,则不会抱怨。singleitem, = mylist
验证您只有一个元素,没有更多,不少。
Answers:
序列拆包:
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为空或具有多个项目,则会引发错误。
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