我正在寻找dictionary.get(key, default)
的python等效列表。是否有任何一个习惯用语来获取列表的第n个元素或默认值(如果不可用)?
例如,给定一个列表myList我想获得myList[0]
,如果myList
是一个空列表,则为5。
感谢。
答案 0 :(得分:103)
l[index] if index < len(l) else default
为支持负指数,我们可以使用:
l[index] if -len(l) <= index < len(l) else default
答案 1 :(得分:44)
try:
a = b[n]
except IndexError:
a = default
编辑:我删除了对TypeError的检查 - 可能最好让调用者处理这个。
答案 2 :(得分:26)
(a[n:]+[default])[0]
这可能会更好a
变大
(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]
[]
完整的表达
>>> (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
答案 3 :(得分:23)
刚刚发现:
next(iter(myList), 5)
iter(l)
返回myList
上的迭代器,next()
使用迭代器的第一个元素,并引发StopIteration
错误,除非使用默认值调用,这是这里的情况是第二个参数5
这只适用于你想要第一个元素的情况,在你的例子中就是这种情况,但在问题的文本中却没有,所以...
此外,它不需要在内存中创建临时列表,它适用于任何类型的迭代,即使它没有名称(参见Xiong Chiamiov对gruszczy的回答的评论)
答案 4 :(得分:16)
(L[n:n+1] or [somedefault])[0]
答案 5 :(得分:4)
...在
dict.get(key, default)
的python中查找等效的列表
对于一般的迭代,有itertools recipes这样做。为方便起见,您可以> pip install more_itertools
并导入为您实现此类配方的第三方库:
<强>代码强>
import more_itertools as mit
mit.nth([1, 2, 3], 0)
# 1
mit.nth([], 0, 5)
# 5
<强>详细强>
以下是nth
食谱的实施:
def nth(iterable, n, default=None):
"Returns the nth item or a default value"
return next(itertools.islice(iterable, n, None), default)
与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
答案 6 :(得分:1)
将@ Joachim与上述相结合,您可以使用
@client
示例:
next(iter(my_list[index:]), default)
或者,可能更清楚,但没有next(iter(range(10)[8:]), 11)
8
>>> next(iter(range(10)[12:]), 11)
11
len
答案 7 :(得分:1)
使用Python 3.4的contextlib.suppress(exceptions)
构建类似于getitem()
的{{1}}方法。
getattr()
答案 8 :(得分:1)
虽然这不是单行解决方案,但您可以像这样定义一个具有默认值的函数:
def get_val(myList, idx, default=5):
try:
return myList[idx]
except IndexError:
return default
答案 9 :(得分:0)
一种便宜的解决方案是使用枚举来真正做一个字典,并像往常一样使用.get()
,
dict(enumerate(l)).get(7, my_default)
答案 10 :(得分:0)
阅读完答案后,我将使用:
(L[n:] or [somedefault])[0]