(defun calculate-level-sums (lst)
  (let ((level-sums (make-hash-table)))

    (labels ((process-level (sublist level)
               (let () ; Необязательное, но делает код понятнее
                 (dolist (item sublist)
                   (cond
                     ((numberp item)
                      (incf (gethash level level-sums 0) item))
                     ((listp item)
                      (process-level item (1+ level))))))))

      (process-level lst 1))

    (let ((result '()))
      ; Всегда добавляем уровень 1 с суммой 0, если он еще не был обработан
      (unless (gethash 1 level-sums)
        (setf (gethash 1 level-sums) 0)) ; Устанавливаем сумму для уровня 1

      (maphash (lambda (level sum)
                 (push (list level sum) result))
               level-sums)  ; Собираем пары level/sum

      (sort result #'< :key #'car))))


(format t "~a~%" (calculate-level-sums '(a (b (4 (2 e (3) k 15) e 5) 7))))
; Теперь должно выводить ((1 0) (2 7) (3 9) (4 17) (5 3))

;Проверка другими входными значениями
(format t "~a~%" (calculate-level-sums '(a b c))) ;((1 0))
(format t "~a~%" (calculate-level-sums '(1 (2 (3))))) ;Выводит ((1 1) (2 2) (3 3))
