如何获得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