Вот функциональное решение. Идентификация целочисленных индексов списка по сравнению со строковыми ключами - сложная часть, но здесь мы разберемся с помощью понимания списка.
d = {"first": [{"second": {"third": "value"}}]}
from functools import reduce
from operator import getitem
def removeFromDict(dataDict, mapStr):
mapList = [int(i[1:-1]) if i.startswith('[') and i.endswith(']') \
else i for i in mapStr.split('.')]
del reduce(getitem, mapList[:-1], dataDict)[mapList[-1]]
return dataDict
d = removeFromDict(d, 'first.[0].second.third')
print(d)
{'first': [{'second': {}}]}