Why doesn't list have safe "get" method like dictionary?
Ultimately it probably doesn't have a safe
.get method because a
dict is an associative collection (values are associated with names) where it is inefficient to check if a key is present (and return its value) without throwing an exception, while it is super trivial to avoid exceptions accessing list elements (as the
len method is very fast). The
.get method allows you to query the value associated with a name, not directly access the 37th item in the dictionary (which would be more like what you're asking of your list).
Of course, you can easily implement this yourself:
def safe_list_get (l, idx, default): try: return l[idx] except IndexError: return default
You could even monkeypatch it onto the
__builtins__.list constructor in
__main__, but that would be a less pervasive change since most code doesn't use it. If you just wanted to use this with lists created by your own code you could simply subclass
list and add the
This works if you want the first element, like
1,2,3]next(iter(my_list), 'fail')1my_list = next(iter(my_list), 'fail')'fail'my_list = [
I know it's not exactly what you asked for but it might help others.
Probably because it just didn't make much sense for list semantics. However, you can easily create your own by subclassing.
class safelist(list): def get(self, index, default=None): try: return self.__getitem__(index) except IndexError: return defaultdef _test(): l = safelist(range(10)) print l.get(20, "oops")if __name__ == "__main__": _test()