我试图对交互者的第一个和最后一个元素执行检查。它有几千个条目,所以我需要一种快速的检查方法。如果找到this post,那就让我接受了这个策略。
first = True
for value in iterator:
if first:
do_stuff_to_first_iter
first = False
else:
pass
do_stuff_to_last_iter
任何人对更快速完成此方法有什么意见?非常感谢!
答案 0 :(得分:16)
使用next()
function获取第一个值:
first = last = next(iterable, defaultvalue)
for last in iterable:
pass
这假设迭代是有限的。
对于空的可迭代,first
和last
设置为defaultvalue
。对于只有一个元素的可迭代,first
和last
都将引用该元素。对于任何其他有限迭代,first
将具有第一个元素,last
是最后一个元素。
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:1)
根据我的测试,islice比for: pass
或deque
快3倍。但这需要你知道会有多少项目。
last = next(islice(iterable, length - 1, length))
或者,如果您不知道全长,但确实知道它必须至少 n
,您仍然可以“跳过”n
作为快捷键:
rest = islice(iterable, n, None)
last = next(rest)
for last in rest:
pass