如何获取python列表的第n个元素或默认值(如果不可用)

use*_*454 128 python list

我正在寻找一个等效的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)

  • 你似乎忘记了负面指数的情况.例如.`index == -1000000`应返回`default`. (9认同)
  • @ToolmakerSteve:你的`valid_index()`的公式不正确.负指数*在Python中是合法的 - 它应该是`-len(l)<= index <len(l)`. (5认同)
  • 标准警告:仅限2.5+ (4认同)
  • @nodakai,好点.我有时被这个咬了.`x [index] if 0 <= index <len(x)else default`如果`index`可能是负数会更好. (3认同)
  • @nodakai哇 - 这是一个很好的例子,为什么使用try/except可能更好,而不是尝试正确编码测试,所以它永远不会失败.我仍然不喜欢依赖try/except,对于我知道会发生的情况,但这增加了我考虑它的意愿. (3认同)
  • 但是,如果您的列表没有名称,则无法使用-例如,在列表理解中。 (2认同)

Tim*_*ker 49

try:
   a = b[n]
except IndexError:
   a = default
Run Code Online (Sandbox Code Playgroud)

编辑:我删除了TypeError的检查 - 可能最好让调用者处理它.

  • 我喜欢这个.只需将其包装在一个函数中,以便可以使用iterable作为参数调用它.更容易阅读. (2认同)

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)

  • 你会在实际的代码中写这个没有评论来解释它吗? (4认同)
  • @Peter Hansen,仅当我打高尔夫球时;)但是它确实适用于所有版本的 Python。接受的答案仅适用于 2.5+ (2认同)
  • 但它会创建3个临时列表并访问2个索引以便选择项目. (2认同)

Joa*_*lon 26

刚刚发现:

next(iter(myList), 5)
Run Code Online (Sandbox Code Playgroud)

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

这只适用于你想要第一个元素的情况,在你的例子中就是这种情况,但在问题的文本中却没有,所以......

此外,它不需要在内存中创建临时列表,它适用于任何类型的迭代,即使它没有名称(请参阅Xiong Chiamiov对gruszczy的回答的评论)

  • 结合其他答案:`next(iter(myList [n:n + 1]),5)`现在可用于第n个元素。 (3认同)

Ign*_*ams 18

(L[n:n+1] or [somedefault])[0]
Run Code Online (Sandbox Code Playgroud)

  • @JoachimJablon:仍然有效。切片返回一个列表,“[False]”为 true。 (2认同)

pyl*_*ang 5

...在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)