Pythonic方法获取1大小列表中的单个元素
在python中,获取1个大小的列表中的单个项的最具python风格的方式是什么 我通常去看电影Pythonic方法获取1大小列表中的单个元素,python,Python,在python中,获取1个大小的列表中的单个项的最具python风格的方式是什么 我通常去看电影 item = singlet_list[0] 对于空列表,这将失败,但我希望有一种方法使其失败,即使列表较长,例如: assert(len(singlet_list) == 1) item = singlet_list[0] 但我觉得这很难看。还有更好的吗?这表明我爱上了一个优雅的解决方案: (item,) = singlet_list 我发现它更具可读性,而且它适用于任何iterable,即
item = singlet_list[0]
对于空列表,这将失败,但我希望有一种方法使其失败,即使列表较长,例如:
assert(len(singlet_list) == 1)
item = singlet_list[0]
但我觉得这很难看。还有更好的吗?这表明我爱上了一个优雅的解决方案:
(item,) = singlet_list
我发现它更具可读性,而且它适用于任何iterable,即使它不可索引
编辑:让我再挖一点
这个构造在python文档中被调用或贯穿整个python文档,但我在这里使用赋值左边的一个1大小的元组
这实际上有一个类似于初始问题中的2行的行为:如果list/iterablesinglet_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