考虑这段代码
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
答案 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。