Answers:
l[index] if index < len(l) else default
为了支持负索引,我们可以使用:
l[index] if -len(l) <= index < len(l) else default
index == -1000000
应该回来default
。
x[index] if 0 <= index < len(x) else default
如果index
可以是负面的,那会更好。
valid_index()
不正确。负索引在Python中是合法的-应该是-len(l) <= index < len(l)
。
try:
a = b[n]
except IndexError:
a = default
编辑:我删除了对TypeError的检查-可能最好让调用者处理。
(a[n:]+[default])[0]
a
越大越好
(a[n:n+1]+[default])[0]
这是可行的,因为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]
[]
和完整的表达
>>> (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(lst[i:i+1]), default)
-这只是神秘的丑陋单线比赛中的另一项参赛作品。
刚刚发现:
next(iter(myList), 5)
iter(l)
在上返回迭代器myList
,next()
消耗迭代器的第一个元素,并引发StopIteration
错误,除非使用默认值调用(在这种情况下为第二个参数,5
这仅在您需要第一个元素时才有效,在您的示例中就是这种情况,但在您要提问的文本中不是如此,所以...
此外,它不需要在内存中创建临时列表,并且即使没有名称,它也可以用于任何可迭代的类型(请参阅Xiong Chiamiov对gruszczy答案的评论)
next(iter(myList[n:n+1]), 5)
现在,它适用于n
th元素。
try
变体不是单线的(OP要求)。它仅适用于列表,因为它myList
是由OP指定的列表(准确地说,它是可索引的)。在内存中创建副本的成本并不高,因为我在此处创建一个(或无)单个元素的列表。当然,有一些开销,但是除非您在循环中进行数百万次,否则不值得一提。顺便说一句,我想创建和捕获IndexError
异常可能会更昂贵。
(L[n:n+1] or [somedefault])[0]
[] or ...
事情。但是,我个人只会使用公认的解决方案,因为它易于阅读(对于新手)。当然,将其包装在带有注释的“ def”中将使大部分问题不再存在。
L[n] == False
或者L[n] == None
或者L[n] == []
更全局地将所有评估为False的东西怎么办?
[False]
为true。
myval = l[n:n+1] or [somedefault]
会很好吗?
...在
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
详情
这是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