从列表中获取第一个元素,无异常

时间:2013-07-10 17:48:44

标签: python python-2.7

考虑这段代码

description = ""
desc = hxs.select('/html/head/meta[2]/@content').extract()
if len(desc) > 0:
    description = desc[0]       
item["description"] = description

desc是一个字符串列表。如果list为空,则description为空字符串,如果不是,则为列表中的第一个元素。如何使它更加pythonic?

忘记提到我必须使用2.7

4 个答案:

答案 0 :(得分:9)

你可以写:

desc = hxs.select("/html/head/meta[2]/@content").extract()
item["description"] = desc[0] if len(desc) > 0 else ""

正如下面的评论中所指出的,您还可以直接在布尔上下文中评估列表:

item["description"] = desc[0] if desc else ""

答案 1 :(得分:4)

或者,您可以使用next支持默认

的事实
item["description"]  = next(iter(desc), "")

答案 2 :(得分:1)

您可以使用异常处理(尽管它比使用条件表达式更冗长)。

desc = hxs.select('/html/head/meta[2]/@content').extract()
try:
    description = desc[0]
except IndexError:
    description = ""

答案 3 :(得分:0)

我认为你不应该在你的情况下这样做,但为了完整......

对于可能为空的迭代器,您只需使用next的可选默认值:

desc = foo.finditer(bar)
item["description"] = next(desc, "")

同时,你总是可以使用iter()来“窥视”从序列(或其他非迭代器可迭代)得到的迭代器。

所以:

desc = foo.findall(bar)
item["description"] = next(iter(desc), "")

我认为这比仅使用列表作为序列(无论是使用chepner的EAFP答案还是使用FrédéricHamidi的LYBL)而不仅仅是可迭代的可读性更低。毕竟,出于某种原因,我们有序列API。