fork download
  1. from itertools import tee, chain, islice, izip
  2. import random
  3. import timeit
  4.  
  5.  
  6. def prev_cur_next_1(sequence):
  7. index = 0
  8. while index < len(sequence):
  9. yield (sequence[index - 1] if index else None,
  10. sequence[index],
  11. sequence[index + 1] if index + 1 < len(sequence) else None)
  12. index += 1
  13. raise StopIteration
  14.  
  15.  
  16. def prev_cur_next_2(list_arg):
  17. extended_list = [None]
  18. extended_list.extend(list_arg)
  19. extended_list.append(None)
  20. return (extended_list[i - 1:i + 2] for i in xrange(1, len(extended_list) - 1))
  21.  
  22.  
  23. def prev_cur_next_3(some_iterable):
  24. prevs, items, nexts = tee(some_iterable, 3)
  25. prevs = chain([None], prevs)
  26. nexts = chain(islice(nexts, 1, None), [None])
  27. return izip(prevs, items, nexts)
  28.  
  29.  
  30. def prev_cur_next_4(seq):
  31. return izip(chain([None], seq), seq, chain(islice(seq, 1, None), [None]))
  32.  
  33.  
  34. d = {1: 10, 2: 20, 3:30}
  35.  
  36. # в следующем применении
  37. # prev_cur_next_1 - не будет работать
  38. # prev_cur_next_2 - не будет работать
  39. # prev_cur_next_4 - будет работать некорректно
  40.  
  41. print 'prev_cur_next_3', list(prev_cur_next_3(d.itervalues()))
  42. print 'prev_cur_next_4', list(prev_cur_next_4(d.itervalues()))
Success #stdin #stdout 0.02s 11496KB
stdin
Standard input is empty
stdout
prev_cur_next_3 [(None, 10, 20), (10, 20, 30), (20, 30, None)]
prev_cur_next_4 [(None, 10, 30)]