在python中获取1个大小的列表的单个项目的最pythonic方法是什么?
我通常会去
item = singlet_list[0]
这对于一个空列表会失败,但我希望有一种方法可以让它失败,即使列表更长,例如:
assert(len(singlet_list) == 1)
item = singlet_list[0]
但我觉得这很难看。还有什么更好的吗?
答案 0 :(得分:6)
这blog post提出了一个我爱上的优雅解决方案:
(item,) = singlet_list
我觉得它更具可读性,而且它适用于任何可迭代的,即使它不可索引。
编辑:让我再挖一点这个结构在整个python文档中被称为sequence unpacking或multiple assignment,但是在这里我在赋值的左边使用了一个1大小的元组。
这实际上是一个与初始问题中的2行类似的行为:如果list / iterable singlet_list
的长度为1,则它将唯一的元素分配给item
。相反,它会失败,并且会出现ValueError
(而不是问题的2-liner中的AssertionError
):
>>> (item,) = [1]
>>> item
1
>>> (item,) = [1, 2]
ValueError: too many values to unpack
>>> (item,) = []
ValueError: need more than 0 values to unpack
正如博客文章所指出的,这有一些优点:
[0]
索引更具可读性,即使在复杂的语句中也不会被忽略。assert
答案 1 :(得分:3)
您可以使用内联if...else
并定义默认值,如下所示:
如果singlet_list
包含一个或多个值:
singlet_list = [2]
item = singlet_list[0] if singlet_list else False
print item
输出:
2
如果singlet_list
为空:
singlet_list = []
item = singlet_list[0] if singlet_list else False
print item
输出:
False
这使用空列表评估为False
的事实。
同样,如果您希望在列表中不包含一个元素时分配默认值,则可以检查长度:
item = singlet_list[0] if len(singlet_list) == 1 else False