Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pythonic方法获取1大小列表中的单个元素_Python - Fatal编程技术网

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

Pythonic方法获取1大小列表中的单个元素,python,Python,在python中,获取1个大小的列表中的单个项的最具python风格的方式是什么 我通常去看电影 item = singlet_list[0] 对于空列表,这将失败,但我希望有一种方法使其失败,即使列表较长,例如: assert(len(singlet_list) == 1) item = singlet_list[0] 但我觉得这很难看。还有更好的吗?这表明我爱上了一个优雅的解决方案: (item,) = singlet_list 我发现它更具可读性,而且它适用于任何iterable,即

在python中,获取1个大小的列表中的单个项的最具python风格的方式是什么

我通常去看电影

item = singlet_list[0]
对于空列表,这将失败,但我希望有一种方法使其失败,即使列表较长,例如:

assert(len(singlet_list) == 1)
item = singlet_list[0]
但我觉得这很难看。还有更好的吗?

这表明我爱上了一个优雅的解决方案:

(item,) = singlet_list
我发现它更具可读性,而且它适用于任何iterable,即使它不可索引

编辑:让我再挖一点

这个构造在python文档中被调用或贯穿整个python文档,但我在这里使用赋值左边的一个1大小的元组

这实际上有一个类似于初始问题中的2行的行为:如果list/iterable
singlet_list
的长度为1,它将把它的唯一元素分配给
。否则,它将失败,并出现相应的
ValueError
(而不是像问题中的2行程序那样出现
AssertionError
):

正如博文中指出的,这有一些好处:

  • 这不会像原始问题所要求的那样默默地失败
  • 它比
    [0]
    索引更具可读性,即使在复杂的语句中,它也不会被忽略
  • 它适用于任何对象
  • (当然)相对于显式使用
    assert

您可以使用内联
if…else
并定义如下默认值:

如果
singlet\u列表
包含一个或多个值:

singlet_list = [2]
item = singlet_list[0] if singlet_list else False
print item
输出:

2
如果
singlet\u 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

对于空列表,此方法仍将失败<代码>值错误:需要0个以上的值才能解包顺便说一下,我对这个解决方案感到惊讶,但我会等一段时间再接受它,以防有人想出什么更好的解决方案better@Cyber这根本不是问题。当列表为空时,没有要提取的值。@Davide我编辑它时,使用了一种避免列表为空时出现ValueError的方法。@Cyber这实际上就是问题的关键:如果出现任何错误,并且列表/序列有多个值,请不要默默失败。如果列表为空或有多个项,会发生什么情况?@PadraicCunningham对于我的用例,我希望它失败如果发生这种情况,请大声说。我的观点是,如果列表较长,则第一个选项会起作用(隐式地选择序列中的第一个选项)。相反,第二个代码段在太长和太短的输入中都会失败,但它位于两行上,在某种程度上阻碍了代码流。
item = singlet_list[0] if len(singlet_list) == 1 else False