Advertisement
Guest User

Untitled

a guest
Apr 1st, 2015
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.12 KB | None | 0 0
  1. from itertools import groupby
  2.  
  3. def dlist_sum_group(
  4. target_dlist,
  5. groupby_field_list = [],
  6. sum_field_list = [],
  7. field_list = [],
  8. convert = tolong,
  9. ):
  10. return dlist_agregate_group(
  11. agregate_function = sum,
  12. target_dlist = target_dlist,
  13. agregate_field_list = sum_field_list,
  14. field_list = field_list,
  15. convert = lambda x: tolong(x, 0)
  16. )
  17.  
  18.  
  19. def dlist_agregate_group(
  20. agregate_function,
  21. target_dlist,
  22. groupby_field_list = [],
  23. agregate_field_list = [],
  24. field_list = [],
  25. convert = lambda x: x
  26. ):
  27.  
  28. if(not groupby_field_list):
  29. field_set = set(field_list)
  30. field_set_for_sum = set(agregate_field_list)
  31. field_set.difference_update(field_set_for_sum)
  32. groupby_field_list = list(field_set)
  33.  
  34.  
  35. def build_groupby_key_dict(item):
  36. return {
  37. field : item.get(field)
  38. for field in groupby_field_list
  39. }
  40.  
  41. target_dlist = sorted(
  42. target_dlist,
  43. key=build_groupby_key_dict
  44. )
  45.  
  46. prefetch = [
  47. (groupby_key_dict, list(for_agregate_generator))
  48. for groupby_key_dict, for_agregate_generator in groupby(
  49. target_dlist,
  50. key=build_groupby_key_dict
  51. )
  52. ]
  53.  
  54. target_dlist = [
  55. dict(
  56. groupby_key_dict.items()
  57. + [
  58. (
  59. field,
  60. agregate_function(convert(fa_dict.get(field, 0))
  61. for fa_dict in for_agregate_dlist)
  62. )
  63. for field in agregate_field_list
  64. ]
  65. )
  66. for groupby_key_dict, for_agregate_dlist in prefetch
  67. ]
  68. return target_dlist
  69.  
  70.  
  71. def tolong(a, default = None):
  72. if(None == a):
  73. return default
  74. if isinstance(a, long):
  75. return a
  76. if isinstance(a, str) or isinstance(a, unicode):
  77. if(not check_isdigit(a)):
  78. return default
  79. try:
  80. return long(a)
  81. except:
  82. return default
  83. return default
  84.  
  85. def check_isdigit(s):
  86. if len(s) and s[0] in ('-', '+'):
  87. return s[1:].isdigit()
  88. return s.isdigit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement