Сменить цикл 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 шт):
Вообще согласен с комментарием 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, .), чтобы потом список не разворачивать.
эту задачу можно по разному решить, но если вы хотите это сделать именно через списковое включение, то у меня так получилось:
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,'