Python: Как РЕКУРСИВНО удалить значения None из структуры данных NESTED (списки и словари)?

Вот некоторые вложенные данные, которые включают списки, кортежи и словари:

data1 = ( 501, (None, 999), None, (None), 504 )
data2 = { 1:601, 2:None, None:603, 'four':'sixty' }
data3 = OrderedDict( [(None, 401), (12, 402), (13, None), (14, data2)] )
data = [ [None, 22, tuple([None]), (None,None), None], ( (None, 202), {None:301, 32:302, 33:data1}, data3 ) ]

Цель: удалить все ключи или значения (из "данные") которые являются None. Если список или словарь содержит значение, которое само является списком, кортежем или словарем, то RECURSE, чтобы удалить NESTED Nones.

Желаемый вывод:

[[22, (), ()], ((202,), {32: 302, 33: (501, (999,), 504)}, OrderedDict([(12, 402), (14, {'four': 'sixty', 1: 601})]))]

Или, что более понятно, вот форматированный вывод:

StripNones(data)= list:
. [22, (), ()]
. tuple:
. . (202,)
. . {32: 302, 33: (501, (999,), 504)}
. . OrderedDict([(12, 402), (14, {'four': 'sixty', 1: 601})])

Я предложу возможный ответ, так как я не нашел существующего решения для этого. Я ценю любые альтернативы или указатели на уже существующие решения.

РЕДАКТИРОВАТЬ Я забыл упомянуть, что это должно работать в Python 2.7. Я могу'В настоящее время не могу использовать Python 3.

Хотя этоЯВЛЯЕТСЯ Стоит опубликовать решения Python 3, для других. Поэтому, пожалуйста, укажите, за какого питона вы отвечаете.

Ответы на вопрос(5)

Ваш ответ на вопрос