編寫一個通用函數,它可以迭代現在返回的任何迭代,下一對。python now,next,n iteration
def now_nxt(iterable):
iterator = iter(iterable)
nxt = iterator.__next__()
for x in iterator:
now = nxt
nxt = x
yield (now,nxt)
for i in now_nxt("hello world"):
print(i)
('h', 'e')
('e', 'l')
('l', 'l')
('l', 'o')
('o', ' ')
(' ', 'w')
('w', 'o')
('o', 'r')
('r', 'l')
('l', 'd')
我一直在思考寫在那裏可以設置在每個元組的項目數的函數的最佳方式。
例如,如果它是
func("hello",n=3)
的結果將是:
('h','e','l')
('e','l','l')
('l','l','o')
我是新來使用timeit,所以請大家指出,如果我在這裏做什麼錯事:
import timeit
def n1(iterable, n=1):
#now_nxt_deque
from collections import deque
deq = deque(maxlen=n)
for i in iterable:
deq.append(i)
if len(deq) == n:
yield tuple(deq)
def n2(sequence, n=2):
# now_next
from itertools import tee
iterators = tee(iter(sequence), n)
for i, iterator in enumerate(iterators):
for j in range(i):
iterator.__next__()
return zip(*iterators)
def n3(gen, n=2):
from itertools import tee, islice
gens = tee(gen, n)
gens = list(gens)
for i, gen in enumerate(gens):
gens[i] = islice(gens[i], i, None)
return zip(*gens)
def prin(func):
for x in func:
yield x
string = "Lorem ipsum tellivizzle for sure ghetto, consectetuer adipiscing elit."
print("func 1: %f" %timeit.Timer("prin(n1(string, 5))", "from __main__ import n1, string, prin").timeit(100000))
print("func 2: %f" %timeit.Timer("prin(n2(string, 5))", "from __main__ import n2, string, prin").timeit(100000))
print("func 3: %f" %timeit.Timer("prin(n3(string, 5))", "from __main__ import n3, string, prin").timeit(100000))
結果:
$ py time_this_function.py
func 1: 0.163129
func 2: 2.383288
func 3: 1.908363
也許不是:) –
我看不錯。我可能會嘗試通過有兩個循環來擺脫len()檢查:一個是用第一個n-1項來初始化deque,然後是一個循環來產生完整的元組。但是我也可以決定只用一個循環就好了。 –
您可能想考慮只是提出「如何做到這一點」的問題,然後將您的事情發佈爲答案,而不是將其放在問題中。 –