从列表中获取唯一项的Pythonic方式

3
有时候一个函数会返回一个列表,但你知道它只有一个元素。获取这个元素的方法如下:
a = somefunc()[0]

如果列表包含多个项,则它们将被默默丢弃。

这篇文章建议使用

(a,) = somefunc()

一条评论只是提出了

a, = somefunc()

两种方法的优点是,当数组具有超过一个元素时,会产生ValueError: too many values to unpack错误。它们还适用于元组、集合和其他集合。

这些方法是否被认为是Pythonic或令人困惑?它们是否有任何缺点?


2
“(a,)”形式对我来说最易读/最实用。它会产生“ValueError”,并且比没有括号的形式更易读,特别是在快速浏览时。 - Dan Lowe
1
处理元组符号(a,)是我和老一代Python开发人员使用的方法。 - FirebladeDan
1
当你只需要第一个元素时,使用这种方法可能很好。但是如果你需要第四个元素呢?你最终将得到_,_,_,_a = somefunc(),而不是a = somefunc()[4] - kylieCatt
1
@IanAuld "...你知道它只有一个项目"。 - chepner
4
这段话的意思是:@SuperBiasedMan 提到了一个场景,类似于数据库游标。考虑这个代码 cursor.execute("select 1").fetchone()。从SQL语句可以知道,fetchone 的返回值长度为1。 - chepner
显示剩余6条评论
2个回答

5

我一直偏爱

(a,) = somefunc()

正如文章中指出的那样,这是出于以下原因。它假定列表中只有一个元素。更易阅读。并且让断言为您服务。


5

如果你正在使用Python3,一个好的方法是将剩余的值解包到一个可以访问或不访问的变量中。这样可以避免在返回多个值的情况下引发ValueError。

>>> a, *b = ['this', 'that', 'other']
>>> a
'this'
>>> b
['that', 'other']

这似乎特别有用,可以让您看到返回了哪些不需要的值。 - SuperBiasedMan
好的回答!如果他们只需要第一个元素,我会使用类似以下的代码:try: (a,) = somefunc() catch: a, *b = somefunc() 并记录 b 的值,这样你就不必无缘无故地携带 b,但是如果有额外的元素存在,你仍然可以看到它所存储的内容。PS 抱歉格式很糟糕,在评论中无法使用 ctrl + k。 - Obj3ctiv3_C_88
@Obj3ctiv3_C_88 但这意味着您必须重新运行该函数,并且有可能第二次获得不同的结果,仅使用一个参数。 - SuperBiasedMan
2
@Obj3ctiv3_C_88 你可以使用 a, *b = sumfunc() 并检查 if b: log b,这样可以只运行函数一次,以避免可能获得不同的结果。 - Steve O'Driscoll
@SteveO'Driscoll 两种方法都不错,它们的选择取决于 sumfunc() 返回的内容。还要看你预计会多频繁地遇到异常情况。如果大部分情况下都是正常情况,我建议仍然使用 try:catch:,因为在正常情况下它比 except:快约60%。 - Obj3ctiv3_C_88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接