Pythonic方式获取1个大小的列表的单个元素

时间:2014-07-21 16:30:37

标签: python

在python中获取1个大小的列表的单个项目的最pythonic方法是什么?

我通常会去

item = singlet_list[0]

这对于一个空列表会失败,但我希望有一种方法可以让它失败,即使列表更长,例如:

assert(len(singlet_list) == 1)
item = singlet_list[0]

但我觉得这很难看。还有什么更好的吗?

2 个答案:

答案 0 :(得分:6)

blog post提出了一个我爱上的优雅解决方案:

(item,) = singlet_list

我觉得它更具可读性,而且它适用于任何可迭代的,即使它不可索引。

编辑:让我再挖一点

这个结构在整个python文档中被称为sequence unpackingmultiple 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]索引更具可读性,即使在复杂的语句中也不会被忽略。
  • 适用于任何iterable对象。
  • (当然)它只使用一行,明确使用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