Advertisement
Guest User

Untitled

a guest
Jun 9th, 2017
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.94 KB | None | 0 0
  1. import itertools
  2.  
  3. from itertools import groupby
  4. from operator import itemgetter
  5.  
  6. testdata = [
  7.         {
  8.             'Elements' : [
  9.                 { 'Type': 't', 'Id': 1 },
  10.                 { 'Type': 'u', 'Id': 2 },
  11.                 { 'Type': 't', 'Id': 3 },
  12.                 { 'Type': 'u', 'Id': 1 },
  13.             ]
  14.         },
  15.         {
  16.             'Elements' : [
  17.                 { 'Type': 'u', 'Id': 1 },
  18.                 { 'Type': 't', 'Id': 2 },
  19.                 { 'Type': 'u', 'Id': 3 },
  20.                 { 'Type': 't', 'Id': 1 },
  21.                 { 'Type': 'u', 'Id': 2 },
  22.  
  23.             ]
  24.         },
  25.     ]
  26.  
  27. flat = sum((f['Elements'] for f in testdata), [])
  28. sflat = sorted(flat, key=lambda e: (e['Type'], e['Id']))
  29. gflat = [list(g) for k, g in groupby(sflat, key=lambda e: (e['Type'], e['Id']))]
  30.  
  31. #print("Grouped:")
  32. result = [ list(g) for kf in (itemgetter('Type', 'Id'),)
  33.         for _, g in groupby(sorted(sum((f['Elements'] for f in testdata), []), key=kf), key=kf) ]
  34. assert result == gflat
  35. #print(result)
  36.  
  37. def _extractor_func(extractor, kwargs):
  38.     def _ident(x):
  39.         return x
  40.  
  41.     if extractor:
  42.         if len(extractor) > 1:
  43.             raise TypeError('Too many positional arguments. Only 1 allowed.')
  44.         return extractor[0]
  45.  
  46.     if not kwargs:
  47.         return _ident
  48.  
  49.     if len(kwargs) != 1:
  50.         raise TypeError('Too many named parameters. Only 1 allowed.')
  51.  
  52.     for var, code in kwargs.items():
  53.         return eval('lambda {}: {}'.format(var, code))
  54.  
  55. def select_many(seq, *extractor, **kw):
  56.  
  57.     extract = _extractor_func(extractor, kw)
  58.  
  59.     for item in seq:
  60.         for val in extract(item):
  61.             yield val
  62.  
  63. def group_by(seq, *extractor, **kw):
  64.     extract = _extractor_func(extractor, kw)
  65.  
  66.     for key, group in itertools.groupby(sorted(seq, key=extract), key=extract):
  67.         yield list(group)
  68.  
  69. flat2 = list(select_many(testdata, f = "f['Elements']"))
  70. assert flat2 == flat
  71. result2 = group_by(flat2, e = "e['Type'], e['Id']")
  72. assert result2 == result2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement