viết một hàm chung có thể lặp qua bất kỳ vòng lặp nào có thể lặp lại hiện tại, cặp tiếp theo.python ngay bây giờ, tiếp theo, n lần lặp
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')
Tôi đã suy nghĩ về cách tốt nhất để viết một hàm có thể đặt số lượng mục trong mỗi bộ.
ví dụ nếu nó là
func("hello",n=3)
kết quả sẽ là:
('h','e','l')
('e','l','l')
('l','l','o')
Tôi mới vào sử dụng timeit, vì vậy hãy chỉ ra nếu tôi làm điều gì sai trái ở đây:
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))
kết quả:
$ py time_this_function.py
func 1: 0.163129
func 2: 2.383288
func 3: 1.908363
Có lẽ không :) –
Trông tốt với tôi. Tôi có thể thử loại bỏ len() kiểm tra bằng cách có hai vòng: một để thủ deque với các mục n-1 đầu tiên, và sau đó một vòng lặp để sản lượng đầy đủ. Nhưng tôi cũng có thể quyết định nó tốt hơn chỉ với một vòng lặp. –
Bạn có thể muốn xem xét chỉ cần đặt câu hỏi "cách thực hiện việc này" và sau đó đăng câu hỏi của bạn dưới dạng câu trả lời, thay vì đặt câu hỏi đó vào câu hỏi. –