Рекурсивно делай. Опиши требуемую функцию:
def filter_fields(obj: dict[str, ...], fields: list[str]) -> dict[str, ...]:
"""obj - фильтруемый словарь, fields - множество полей, которые надо оставить."""
...
Проблема в том, что поля могут быть вложенным. Тогда первым делом составляешь набор нужных тебе полей верхнего уровня:
top_level_fields = {}
for f in fields:
top, _, bottom = f.partition('.')
top_level_fields.setdefault(top, [])
if bottom is not None:
top_level_fields[top].append(bottom)
Для
fields=['boardId', 'name', 'Data.Matches.t.id', 'Data.Matches.m']
в top_level_fields получишь
{ 'boardId': [], 'name': [], 'Data': ['Matches.t.id', 'Matches.m']}
Дальше перебираешь поля, собираешь их значения в один мешок и смотришь, есть ли для них нижележащие поля:
output = {}
for top, bottom in top_level_fields.items():
if bottom:
output[top] = filter_fields(obj[top], bottom) # что делать, если ключа top нет?
else:
output[top] = obj[top]
Таким образом наберёшь всё, что надо.