2010-09-28 23 views
3

今天偶然发现,认为它可能值得讨论。有趣的Python成语,用于删除单个条目列表中的唯一项目

Python的成语采取单 项目从列表中

有时会发生在代码中,我 有一个列表,让我们称之为stuff,并 我肯定知道这个名单 正好包含一个项目。我想 得到这个项目,并把它放在一个 变量,称之为事情。什么是 这样做的最好方法?在过去,我 用来做这个:

thing = stuff[0] 

但我认为这不是最好的成语。我想出了一个更好的 :

(thing,) = stuff 

为什么这一个更好?

可读性:它让读者知道 东西只有一个元素。

免费断言:它使Python的断言 是stuff有且只有一个元素,所以 ,如果我错了,我原来 假设stuff有且只有一个 元素,Python会在我喊 在此之前表现作为 难以发现的错误 程序中的其他地方。

不容错过:之前的 方法最后有[0]。现在, 很容易注意到一行 简称thing = stuff[0]。但是,如果 线是东西凌乱像 这样:

thing = some_dict[my_object.get_foobar_handler()][0] 

在这种情况下,[0]到底是 容易错过,因为当随便 一眼代码,它似乎 连接到该函数调用或 字典查找。所以读者可能会错过 这个事实,我们在这里列出一个列表项目列表 。这将是在这种情况下更好 :

(thing,) = some_dict[my_object.get_foobar_handler()] 

一般用于任何“收藏”(道具 Ulrik合作的指出这一点):此方法 工作,即使东西是一组或任何 其他种类的采集。 stuff[0] 不能在一组上工作,因为组 不支持通过索引 号码访问。玩得开心编程!

http://blog.garlicsim.org/post/1198230058/python-idiom-for-taking-the-single-item-from-a-list

在一般情况下,我已经撕破的想法。他对自由断言和可读性提出了令人信服的论点(如果它成为一种模式)。另一方面,直到/如果它变得流行,它有点难以阅读。

社区有什么想法?

+0

没有暗示优点或以其他方式,只是想我会提到这一点,也可以不带括号:'事,= stuff'。 – MattH 2010-09-28 12:57:53

+1

@Matth:但是最后的逗号(无parens)也很容易忽略。 – delnan 2010-09-28 13:41:33

回答

7

博客海报希望单个语句的功能如下:(1)从列表中提取项目,(2)声明,(3)作为评论告诉用户该列表只有一个项目。

我尽量减少代码的行数的一个巨大的风扇,但我更喜欢极大以下:

assert len(stuff) == 1, "stuff should have length 1 but has length %d" % len(stuff) 
thing = stuff[0] 

明确优于隐式。

+0

+1:断言通常是必需的。令人惊讶的是经常。你可能会认为你知道它有一个元素。但你在其他地方有问题。 – 2010-09-28 14:50:53

2

我喜欢:

[thing] = stuff 

如果仅仅是因为我觉得(thing,)是丑陋的。但我喜欢这个概念。

0

一个人可能会错过自己的逗号,我宁愿将东西放在括号(和逗号)的东西上。

我想我目前有线写thing = stuff[0]