从Python中的单元素列表中仅获取元素?

Pyd*_*man 57 python list python-2.7 python-3.x iterable-unpacking

当已知Python列表始终包含单个项目时,是否可以访问它而不是:

mylist[0]
Run Code Online (Sandbox Code Playgroud)

你可能会问,'你为什么要这样?'.仅好奇心.似乎有另一种方法可以在Python中完成所有工作.

Sha*_*ger 89

序列拆包:

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
Run Code Online (Sandbox Code Playgroud)

显式使用迭代器协议:

singleitem = next(iter(mylist))
Run Code Online (Sandbox Code Playgroud)

破坏性流行音乐:

singleitem = mylist.pop()
Run Code Online (Sandbox Code Playgroud)

负指数:

singleitem = mylist[-1]
Run Code Online (Sandbox Code Playgroud)

通过单次迭代设置for(因为循环变量在循环终止时仍保持其最后一个值):

for singleitem in mylist: break
Run Code Online (Sandbox Code Playgroud)

许多其他的(结合或改变上面的位,或者依赖于隐式迭代),但你明白了.

  • 第一个也可以写成`[singleitem] = mylist`. (6认同)
  • 由于猖獗的疯狂,不值得包含在主要答案中:参数解包为单个参数函数(作为匿名lambda完成,返回最大愚蠢的值):`singleitem =(lambda x:x)(*mylist)` (4认同)
  • 第一个是唯一的,因为如果列表包含多个元素,它也会引发. (4认同)

pyl*_*ang 14

我将补充说,该more_itertools 库有一个工具可以从一个iterable中返回一个项目.

from more_itertools import one


iterable = ["foo"]
one(iterable)
# "foo"
Run Code Online (Sandbox Code Playgroud)

此外,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)
Run Code Online (Sandbox Code Playgroud)