Guest User

Untitled

a guest
Apr 20th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.07 KB | None | 0 0
  1. from collections import defaultdict
  2.  
  3. def split_d(d, key):
  4. include = defaultdict(list)
  5. exclude = defaultdict(list)
  6.  
  7. for i in range(0, len(d[key])):
  8. binary = d[key][i]
  9. for k, v in d.items():
  10. if k == key:
  11. continue
  12.  
  13. if binary == 0:
  14. exclude[k].append(v[i])
  15. elif binary == 1:
  16. include[k].append(v[i])
  17. else:
  18. raise ValueError(f"Key {key} is not binary. Expected values 0 or 1")
  19.  
  20. return include, exclude
  21.  
  22. d = {
  23. 'prof': [1,0,0,1,1,1,1,1,0,1],
  24. 'val': [45,12,36,48,48,59,5,4,32,7]
  25. }
  26.  
  27. print(split_d(d, 'prof'))
  28.  
  29. import itertools
  30.  
  31. def split_d(d, key, val):
  32. assert set(d[key]) == {0, 1}
  33. sorted_tuples = sorted(zip(d[key], d[val]), key=lambda x: x[0])
  34. grouped = itertools.groupby(sorted_tuples, lambda x: x[0])
  35. return [{'val': [x[1] for x in g]} for _, g in grouped]
  36.  
  37. In [52]: %timeit split_d_g(d, 'prof', 'val')
  38. 5.63 µs ± 68.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
  39.  
  40. In [53]: %timeit split_d_op(d, 'prof')
  41. 6.82 µs ± 597 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Add Comment
Please, Sign In to add comment