Сменить цикл for на list comprehension

столкнулся с проблемой в коде с заменой цикла for на list comprehensions. Код выглядит так и предназначен для разворота текста без символов и цифр. Сменить нужно только часть с enumerate. Код:

def reverse_word(word) -> Union[int, str]:
    word_out = []
    specials = {}
    
    for i, char in enumerate(word):
        if char.isalpha():
            word_out.append(char)
        else:
            specials[i] = char

    word_out = word_out[::-1]

    for key, word in specials.items():
        word_out.insert(key, word)
    return ''.join(word_out)

Получилось что-то подобное, но не понимаю как правильно обратится к i:

[word_out.append(i) if char.isalpha() else specials[i] = i  for i  in enumerate(word)]

Ответы (2 шт):

Автор решения: n1tr0xs

Вообще согласен с комментарием insolor

List comprehension должен только формировать новый список, но не модифицировать другие объекты

Но если сильно надо:

[word_out.append(char) if char.isalpha() else specials.__setitem__(i, char)  for i, char  in enumerate(word)]

Вообще эта задачу можно решить и без словаря:

def rev(word):
    letters = list()
    specials = list()
    for i in range(len(word)):
        if word[i].isalpha():
            letters.append(i)
        else:
            specials.append(i)
            
    letters = letters[::-1]
    for i in specials:
        letters.insert(i, i)
    return ''.join(word[i] for i in letters)

Ну и свернуто [letters.append(i) if word[i].isalpha() else specials.append(i) for i in range(len(word))]
А еще вместо append можно использовать insert(0, .), чтобы потом список не разворачивать.

→ Ссылка
Автор решения: SergFSM

эту задачу можно по разному решить, но если вы хотите это сделать именно через списковое включение, то у меня так получилось:

word = 'abc def%ghj1#kl,'

rev_word = (word[i] for i in range(len(word)-1,-1,-1) if word[i].isalpha())

''.join([next(rev_word) if word[i].isalpha() else word[i] for i in range(len(word))])

>>> out
'''
'lkj hgf%edc1#ba,'
→ Ссылка