我正在寻找一个等效的python dictionary.get(key, default)列表.是否有任何一个习惯用语来获取列表的第n个元素或默认值(如果不可用)?
例如,给定一个我希望获得的列表myList myList[0],或者如果myList是一个空列表,则为5 .
谢谢.
gru*_*czy 110
l[index] if index < len(l) else default
Run Code Online (Sandbox Code Playgroud)
为支持负指数,我们可以使用:
l[index] if -len(l) <= index < len(l) else default
Run Code Online (Sandbox Code Playgroud)
Tim*_*ker 49
try:
a = b[n]
except IndexError:
a = default
Run Code Online (Sandbox Code Playgroud)
编辑:我删除了TypeError的检查 - 可能最好让调用者处理它.
Joh*_*ooy 29
(a[n:]+[default])[0]
Run Code Online (Sandbox Code Playgroud)
随着a变大,这可能会更好
(a[n:n+1]+[default])[0]
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为if a[n:]是一个空列表ifn => len(a)
以下是一个如何使用的示例 range(5)
>>> range(5)[3:4]
[3]
>>> range(5)[4:5]
[4]
>>> range(5)[5:6]
[]
>>> range(5)[6:7]
[]
Run Code Online (Sandbox Code Playgroud)
并充分表达
>>> (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
Run Code Online (Sandbox Code Playgroud)
Joa*_*lon 26
刚刚发现:
next(iter(myList), 5)
Run Code Online (Sandbox Code Playgroud)
iter(l)返回一个迭代器myList,使用迭代器next()的第一个元素,并引发一个StopIteration错误,除非使用默认值调用,这是第二个参数,5
这只适用于你想要第一个元素的情况,在你的例子中就是这种情况,但在问题的文本中却没有,所以......
此外,它不需要在内存中创建临时列表,它适用于任何类型的迭代,即使它没有名称(请参阅Xiong Chiamiov对gruszczy的回答的评论)
Ign*_*ams 18
(L[n:n+1] or [somedefault])[0]
Run Code Online (Sandbox Code Playgroud)
...在
dict.get(key, default)for列表的python中寻找等效项
有一个itertools配方可用于常规可迭代对象。为了方便起见,您可以> pip install more_itertools导入此为您实现此类配方的第三方库:
码
import more_itertools as mit
mit.nth([1, 2, 3], 0)
# 1
mit.nth([], 0, 5)
# 5
Run Code Online (Sandbox Code Playgroud)
详情
这是nth配方的实现:
def nth(iterable, n, default=None):
"Returns the nth item or a default value"
return next(itertools.islice(iterable, n, None), default)
Run Code Online (Sandbox Code Playgroud)
像一样dict.get(),此工具返回缺失索引的默认值。它适用于一般可迭代项:
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
Run Code Online (Sandbox Code Playgroud)