7

我正在尝试对交互器的第一个和最后一个元素进行检查。它有几千个条目,所以我需要一种快速的检查方法。如果找到这篇文章,那让我采取了这个策略。

first = True
for value in iterator:
   if first:
      do_stuff_to_first_iter
      first = False
   else:
      pass
do_stuff_to_last_iter

有人对更快的方法有什么意见吗?非常感谢!

4

4 回答 4

28

next()使用函数获取第一个值:

first = last = next(iterable, defaultvalue)
for last in iterable:
    pass

这假设迭代是有限的。

对于空的可迭代对象,firstlast设置为defaultvalue. 对于只有一个元素的可迭代对象,first并且last都将引用该元素。对于任何其他有限迭代,first将具有第一个元素,last最后一个元素。

于 2013-11-20T19:01:52.503 回答
3

根据我对链接问题的回答:

__reversed__如果可用,可能值得使用。如果您提供迭代器,并且有一种明智的实现方式__reversed__(即不从端到端迭代),您应该这样做

first = last = next(my_iter)
if hasattr(my_iter,'__reversed__'):
    last = next(reversed(my_iter))
else:
    for last in my_iter:
        pass
于 2013-11-20T19:33:05.800 回答
1

您可以使用 maxlen 为 1 的双端队列来快速获取有限迭代器的最后一个元素:

>>> from collections import deque
>>> last_getter = deque(maxlen=1)
>>> seq = range(10000)
>>> iseq = iter(seq)
>>>
>>> first = last = next(iseq, None)
>>> last_getter.extend(iseq)
>>> if last_getter: last = last_getter[0]
...
>>> print (first, last)
0 9999
于 2013-11-20T20:24:26.117 回答
1

根据我的测试,islicefor: passor快 3 倍deque。不过,这需要您知道会有多少项目。

last = next(islice(iterable, length - 1, length))

或者,如果您不知道完整长度,但知道它必须至少 n是,您仍然可以“跳过”n作为快捷方式:

rest = islice(iterable, n, None)
last = next(rest)
for last in rest:
    pass
于 2014-02-12T19:56:57.450 回答