我想对一个迭代器的第一个和最后一个元素进行检查。由于它有数千条条目,因此我需要一种快速的检查方法。我找到了这篇文章,并从中了解到了以下策略。
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
有没有人对更快地完成这个任务有什么看法?非常感谢!
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
list
提供它,但不提供iter(list)
。 - Martijn Pieterslist()
、range()
、collections.deque()
和 collections.OrderedDict()
提供了 __reversed__
,而且它们本身都不是迭代器。这意味着你不能对它们调用 next()
。 - Martijn Pieters__reversed__
属性,所以我还是得进入循环。感谢您的建议! - Richfor: 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
>>> 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
for item in iterable:
或类似的Python语法? - Martijn Pieterselse: pass
是完全多余的,可以完全省略。在Python中,您不必使用if
语句的else
子句。 - Martijn Pieterselse: pass
是为了退出for
循环。我想这不是必要的。谢谢。 - Rich