有没有一种“获取或默认值”的方式来访问列表?

3

我喜欢函数get,它可以提供默认值,但只适用于字典。

s=dict{}
s.get("Ann", 0)

我为列表写了类似的代码。在Python3.4中是否已存在此函数?

def get(s, ind):
    return len(s)>ind and s[ind] or 0

清楚地说,您的意思是按值获取,对吗?您提出的实现方式令人困惑。 - Two-Bit Alchemist
1
你为什么要使用 and s[ind] - Padraic Cunningham
2个回答

2
不,列表中没有这样的内置方法。检查列表索引是否有效很容易,因此不需要函数。您可以将代码直接放入两个或三个需要它的地方的函数中(或者更易读的是s[ind] if ind < len(s) else 0),这样就可以完全理解了。
您还可以利用对列表进行切片总是成功的事实,取一个一项切片,使其成为迭代器,并尝试从迭代器中获取下一个值。然后,您可以在next()调用上指定默认值。
next(iter(s[ind:ind+1]), 0)

但是这种方式比使用if结构更慢、更不清晰。

当然,你的代码和我的代码都假设ind始终为正数...

如果您确实想编写一个函数,您可以将其作为list子类的方法。


0

列表中没有像get这样的方法,但是你可以使用itertools.islicenext,并将默认值设置为0:

from itertools import islice
def get(s, ind):
    return next(islice(s, ind, ind + 1), 0)

在您的代码中使用and s[ind]将返回默认值0,如果ind处的值为任何falsey值,如0NoneFalse等,则可能不是您想要的。
如果您想为falsey值返回默认值并处理负索引,可以使用abs
def get(s, ind):
    return s[ind] or 0 if len(s) > abs(ind) else 0

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