Ну для начала неплохо бы внятно описать, как задаются желаемые элементы.
Если по индексам, то да, твоё решение через __getitem__() вполне работоспособно.
import typing as t
lst = ['a', 'b', 'c', 'd', 'e'] # не называй переменную list
def split(lst: t.List[t.Any], indices: t.Iterable[int]) -> t.Tuple[t.List[t.Any], t.List[t.Any]]:
selected = list(map(lst.__getitem__, indices))
remainder = list(lst)
# удаляем с конца, чтобы еще не обработанные индексы не поехали
# вот только с отрицательными индексами это уже не прокатит
# их придётся самомму пересчитывать в положительные
for i in sorted(indices, reverse=True):
del remainder[i]
return selected, remainder
print(split(lst, [0, 3])) # (['a', 'd'], ['b', 'c', 'e'])