fork download
  1. from itertools import groupby
  2. from timeit import timeit
  3. import random
  4.  
  5.  
  6. def inplace(d):
  7. m_d = [[x,0] for x in d]
  8.  
  9. mark = 0
  10. _ = iter(range(len(m_d)-1))
  11. for i in _:
  12. while (m_d[i+1][0]-m_d[i][0] <2) and (i<len(m_d)-2):
  13. m_d[i][1] = mark
  14. next(_)
  15. i+=1
  16. m_d[i][1] = mark
  17. mark +=1
  18. # проверка на то, что последние элемент входит в маркируемый блок
  19. if m_d[len(m_d)-1][0] - m_d[len(m_d)-2][0] <2:
  20. m_d[len(m_d)-1][1] = m_d[len(m_d)-2][1]
  21. return m_d
  22.  
  23.  
  24. def markgroups(elems):
  25. def getkey(idx):
  26. "По номеру элемента возвращает ключ его группы"
  27. return elems[idx] - idx
  28.  
  29. groups = (group
  30. for _, group in groupby(range(len(elems)), key=getkey))
  31.  
  32. return [[elems[idx], group_idx]
  33. for group_idx, group in enumerate(groups)
  34. for idx in group]
  35.  
  36.  
  37. data = [x for x in range(1000000) if random.random() < 0.8]
  38.  
  39.  
  40. print('inplace: {:.4f} s'.format(
  41. timeit('inplace(data)',
  42. setup='from __main__ import inplace, data',
  43. number=1)))
  44. print('markgroups: {:.4f} s'.format(
  45. timeit('markgroups(data)',
  46. setup='from __main__ import markgroups, data',
  47. number=1)))
  48.  
  49. a = inplace(data)
  50. b = markgroups(data)
  51.  
  52. assert a == b, "Результаты различаются"
Success #stdin #stdout 2.23s 94784KB
stdin
Standard input is empty
stdout
inplace:    0.4143 s
markgroups: 0.2756 s