from itertools import tee, chain, islice, izip
import random
import timeit
def prev_cur_next_1(sequence):
index = 0
while index < len(sequence):
yield (sequence[index - 1] if index else None,
sequence[index],
sequence[index + 1] if index + 1 < len(sequence) else None)
index += 1
raise StopIteration
def prev_cur_next_2(list_arg):
extended_list = [None]
extended_list.extend(list_arg)
extended_list.append(None)
return (extended_list[i - 1:i + 2] for i in xrange(1, len(extended_list) - 1))
def prev_cur_next_3(some_iterable):
prevs, items, nexts = tee(some_iterable, 3)
prevs = chain([None], prevs)
nexts = chain(islice(nexts, 1, None), [None])
return izip(prevs, items, nexts)
def prev_cur_next_4(seq):
return izip(chain([None], seq), seq, chain(islice(seq, 1, None), [None]))
d = {1: 10, 2: 20, 3:30}
# в следующем применении
# prev_cur_next_1 - не будет работать
# prev_cur_next_2 - не будет работать
# prev_cur_next_4 - будет работать некорректно
print 'prev_cur_next_3', list(prev_cur_next_3(d.itervalues()))
print 'prev_cur_next_4', list(prev_cur_next_4(d.itervalues()))
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IHRlZSwgY2hhaW4sIGlzbGljZSwgaXppcAppbXBvcnQgcmFuZG9tCmltcG9ydCB0aW1laXQKCgpkZWYgcHJldl9jdXJfbmV4dF8xKHNlcXVlbmNlKToKICAgIGluZGV4ID0gMAogICAgd2hpbGUgaW5kZXggPCBsZW4oc2VxdWVuY2UpOgogICAgICAgIHlpZWxkIChzZXF1ZW5jZVtpbmRleCAtIDFdIGlmIGluZGV4IGVsc2UgTm9uZSwKICAgICAgICAgICAgICAgc2VxdWVuY2VbaW5kZXhdLAogICAgICAgICAgICAgICBzZXF1ZW5jZVtpbmRleCArIDFdIGlmIGluZGV4ICsgMSA8IGxlbihzZXF1ZW5jZSkgZWxzZSBOb25lKQogICAgICAgIGluZGV4ICs9IDEKICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KCgpkZWYgcHJldl9jdXJfbmV4dF8yKGxpc3RfYXJnKToKICAgIGV4dGVuZGVkX2xpc3QgPSBbTm9uZV0KICAgIGV4dGVuZGVkX2xpc3QuZXh0ZW5kKGxpc3RfYXJnKQogICAgZXh0ZW5kZWRfbGlzdC5hcHBlbmQoTm9uZSkKICAgIHJldHVybiAoZXh0ZW5kZWRfbGlzdFtpIC0gMTppICsgMl0gZm9yIGkgaW4geHJhbmdlKDEsIGxlbihleHRlbmRlZF9saXN0KSAtIDEpKQoKCmRlZiBwcmV2X2N1cl9uZXh0XzMoc29tZV9pdGVyYWJsZSk6CiAgICBwcmV2cywgaXRlbXMsIG5leHRzID0gdGVlKHNvbWVfaXRlcmFibGUsIDMpCiAgICBwcmV2cyA9IGNoYWluKFtOb25lXSwgcHJldnMpCiAgICBuZXh0cyA9IGNoYWluKGlzbGljZShuZXh0cywgMSwgTm9uZSksIFtOb25lXSkKICAgIHJldHVybiBpemlwKHByZXZzLCBpdGVtcywgbmV4dHMpCgoKZGVmIHByZXZfY3VyX25leHRfNChzZXEpOgogICAgcmV0dXJuIGl6aXAoY2hhaW4oW05vbmVdLCBzZXEpLCBzZXEsIGNoYWluKGlzbGljZShzZXEsIDEsIE5vbmUpLCBbTm9uZV0pKQoKCmQgPSB7MTogMTAsIDI6IDIwLCAzOjMwfQoKIyDQsiDRgdC70LXQtNGD0Y7RidC10Lwg0L/RgNC40LzQtdC90LXQvdC40LgKIyBwcmV2X2N1cl9uZXh0XzEgLSDQvdC1INCx0YPQtNC10YIg0YDQsNCx0L7RgtCw0YLRjAojIHByZXZfY3VyX25leHRfMiAtINC90LUg0LHRg9C00LXRgiDRgNCw0LHQvtGC0LDRgtGMCiMgcHJldl9jdXJfbmV4dF80IC0g0LHRg9C00LXRgiDRgNCw0LHQvtGC0LDRgtGMINC90LXQutC+0YDRgNC10LrRgtC90L4KCnByaW50ICdwcmV2X2N1cl9uZXh0XzMnLCBsaXN0KHByZXZfY3VyX25leHRfMyhkLml0ZXJ2YWx1ZXMoKSkpCnByaW50ICdwcmV2X2N1cl9uZXh0XzQnLCBsaXN0KHByZXZfY3VyX25leHRfNChkLml0ZXJ2YWx1ZXMoKSkp
prev_cur_next_3 [(None, 10, 20), (10, 20, 30), (20, 30, None)]
prev_cur_next_4 [(None, 10, 30)]