Advertisement
gg-master

Untitled

Jun 16th, 2022
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. import pprint
  2.  
  3. # --- Предполагаемые выходные данные ---
  4. categories = [
  5. {'parent_id': 'c1', 'id': 'c2', 'type': 'category', 'name': 'cat2'},
  6. {'parent_id': 'c2', 'id': 'c3', 'type': 'category', 'name': 'cat3'},
  7. {'parent_id': 'c3', 'id': 'c4', 'type': 'category', 'name': 'cat4'},
  8. ]
  9.  
  10. offers2categories = [
  11. {'parent_id': 'c1', 'id': 'o1', 'type': 'offer', 'name': 'of1',
  12. 'price': 1},
  13. {'parent_id': 'c2', 'id': 'o2', 'type': 'offer', 'name': 'of2',
  14. 'price': 2},
  15. {'parent_id': 'c3', 'id': 'o3', 'type': 'offer', 'name': 'of3',
  16. 'price': 3},
  17. {'parent_id': 'c4', 'id': 'o4', 'type': 'offer', 'name': 'of4',
  18. 'price': 4},
  19. ]
  20.  
  21. result = {
  22. 'id': 'c1',
  23. 'name': 'cat1',
  24. 'parent_id': None,
  25. # Цену общую посчитать в целом не сложно
  26. # (можно ее вообще в саомм конце только записать,
  27. # если использовать мое решение)
  28. # sum(map(
  29. # lambda x: x['price'], offers2categories)) // len(offers2categories)
  30. 'price': 0,
  31. 'children': []
  32. }
  33. # --- до сюда то что можем +- незапарно получить из базы ---
  34.  
  35.  
  36. def smart_map(iterator):
  37. """
  38. map, который возвращает цену товара и
  39. параллельно считает количество товаров
  40. :param iterator: offers
  41. :return:
  42. """
  43. global n
  44. for n, val in enumerate(iterator, start=1):
  45. yield val['price']
  46.  
  47.  
  48. pre_res_copy = {}
  49. prev_sum = prev_count = 0
  50. n = 0
  51. for i in range(len(categories) - 1, -1, -1):
  52. curr_id = categories[i]['id']
  53.  
  54. pre_res = {'children': [], 'price': 0}
  55. # Записываем саму категорию
  56. pre_res.update(categories[i])
  57.  
  58. # Товаы, которые принадлежат нашей категории
  59. offers_parents = filter(lambda x: x['parent_id'] == curr_id,
  60. offers2categories)
  61. # Считаем сумму товаров и паралельно их количество
  62. s = sum(smart_map(offers_parents))
  63. # Высчитываем среднюю цену
  64. pre_res['price'] = (s + prev_sum) // (n + prev_count)
  65.  
  66. if pre_res_copy:
  67. # Добавляем вложенную категорию
  68. pre_res['children'].append(pre_res_copy.copy())
  69.  
  70. # Добавляем товары категории
  71. pre_res['children'].extend(filter(lambda x: x['parent_id'] == curr_id,
  72. offers2categories))
  73.  
  74. # Сохраняем, чтобы впоследствии использовать как вложенную
  75. pre_res_copy = pre_res.copy()
  76. # Обновляем счетчики общего числа товаров и суммы
  77. prev_count += n
  78. prev_sum += s
  79.  
  80. # Добавляем товары, которые непосредствнно принадлежат основной категории
  81. offers_parents = filter(lambda x: x['parent_id'] == curr_id, offers2categories)
  82. # Считаем сумму товаров и паралельно их количество
  83. s = sum(smart_map(offers_parents))
  84. result['price'] = (s + prev_sum) // (n + prev_count)
  85.  
  86. result['children'].extend(filter(lambda x: x['parent_id'] == result['id'],
  87. offers2categories))
  88. # Добавляем вложенность
  89. result['children'].append(pre_res_copy)
  90.  
  91. pprint.pprint(result)
  92.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement