如何获得python列表的第n个元素,或者如果不可用,则使用默认值

我在dictionary.get(key,default)的python中寻找列表的等价物。 是否有任何一个class轮成语获得列表的第n个元素或默认值,如果不可用?

例如,给出一个列表myList我想得到myList [0],或者如果myList是一个空列表,则为5。

x[index] if len(x) > index else default 

以支持我们可以使用的负指数:

 x[index] if -len(l) <= index < len(l) else default 
 try: a = b[n] except IndexError: a = default 

编辑:我删除了TypeError的检查 – 可能更好,让调用者处理这个。

 (a[n:]+[default])[0] 

这可能会越来越好

 (a[n:n+1]+[default])[0] 

这是有效的,因为如果a[n:]是一个空列表,如果n => len(a)

这是一个范例range(5)

 >>> range(5)[3:4] [3] >>> range(5)[4:5] [4] >>> range(5)[5:6] [] >>> range(5)[6:7] [] 

和充分的expression

 >>> (range(5)[3:4]+[999])[0] 3 >>> (range(5)[4:5]+[999])[0] 4 >>> (range(5)[5:6]+[999])[0] 999 >>> (range(5)[6:7]+[999])[0] 999 

只是发现:

 next(iter(myList), 5) 

iter(l)返回myList上的迭代器, next()消耗迭代器的第一个元素,并引发StopIteration错误,除非使用默认值调用,这里是第二个参数5

这只适用于当你想第一个元素,这是你的例子,而不是在你的问题的文字,所以…

另外,它不需要在内存中创build临时列表,它可以用于任何types的迭代,即使它没有名称(参见Xiong Chiamiov对gruszczy的回答的评论)

 (L[n:n+1] or [somedefault])[0] 

…在列表的dict.get(key, default) python中寻找等价物

有一个itertools食谱 ,这是一般的迭代。 这里是这个配方的执行称为nth

 def nth(iterable, n, default=None): "Returns the nth item or a default value" return next(islice(iterable, n, None), default) 

为方便起见,您可以安装并导入一个为您实现此类配方的库,例如more_itertools

 import more_itertools as mit mit.nth([0, 1, 2], 1) # 1 

该工具的行为与list.index()__getitem__()类似,但是第nth生成器提供了一个可选的缺省值,可用于一般的迭代:

 mit.nth([0, 1, 2], 3, "some_default") # default keyword # 'some_default' mit.nth((0, 1, 2), 1) # tuple # 1 mit.nth(range(3), 1) # range generator (py3) # 1 mit.nth(iter([0, 1, 2]), 1) # list iterator # 1