На базе дека:
from random import randint
from collections import deque
class Box:
def __init__(self, l, w, h):
self.l, self.w, self.h = l, w, h
def key(self): return - self.l - self.w
def __repr__(self): return f"Box {self.l} x {self.w} x {self.h}"
N = 10
stack = deque(Box(*map(randint, (10,) * 3, (50,) * 3)) for _ in range(N))
lst = sorted(reversed(stack), key = Box.key)
print(*lst, sep = '\n')
Дек имеет константную стоимость добавления в начало и в конец и удаления из начала и конца, в отличие от списка, которому приходится расширяться с переносом элементов.
Стек заполняется элементами Box, добавляемыми в конец. Поэтому извлекать их нужно в обратном порядке, что делается при помощи функции reversed(). Она не копирует элементы, а только меняет порядок обхода.
Элементы скармливаются функции sorted, которая сразу формирует сортированный список по возрастанию ключа (Box.key), т.е. по убыванию суммы длины и ширины.