我正在尝试对交互器的第一个和最后一个元素进行检查。它有几千个条目,所以我需要一种快速的检查方法。如果找到这篇文章,那让我采取了这个策略。
first = True
for value in iterator:
if first:
do_stuff_to_first_iter
first = False
else:
pass
do_stuff_to_last_iter
有人对更快的方法有什么意见吗?非常感谢!
我正在尝试对交互器的第一个和最后一个元素进行检查。它有几千个条目,所以我需要一种快速的检查方法。如果找到这篇文章,那让我采取了这个策略。
first = True
for value in iterator:
if first:
do_stuff_to_first_iter
first = False
else:
pass
do_stuff_to_last_iter
有人对更快的方法有什么意见吗?非常感谢!
next()
使用函数获取第一个值:
first = last = next(iterable, defaultvalue)
for last in iterable:
pass
这假设迭代是有限的。
对于空的可迭代对象,first
并last
设置为defaultvalue
. 对于只有一个元素的可迭代对象,first
并且last
都将引用该元素。对于任何其他有限迭代,first
将具有第一个元素,last
最后一个元素。
根据我对链接问题的回答:
__reversed__
如果可用,可能值得使用。如果您提供迭代器,并且有一种明智的实现方式__reversed__
(即不从端到端迭代),您应该这样做
first = last = next(my_iter)
if hasattr(my_iter,'__reversed__'):
last = next(reversed(my_iter))
else:
for last in my_iter:
pass
您可以使用 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
根据我的测试,islice比for: pass
or快 3 倍deque
。不过,这需要您知道会有多少项目。
last = next(islice(iterable, length - 1, length))
或者,如果您不知道完整长度,但知道它必须至少 n
是,您仍然可以“跳过”n
作为快捷方式:
rest = islice(iterable, n, None)
last = next(rest)
for last in rest:
pass