Создание фильтра в Django

Помогите, пожалуйста, решить задачу по написанию фильтра в Джанго:

"Нужно написать фильтр uglify, который преобразует текст по такому принципу: каждый нечётный символ переводится в нижний регистр, а чётный — в верхний.

Пример вызова фильтра: {{ "Привет мир!!"|uglify }}

Пример результата: пРиВеТ МиР!!

Я понимаю, что нужно фильтром пройтись по всем символам переменной, а также включить условие, которое будет проверять четность символа if x % 2 == 0.

Пока что получилось что-то вроде этого (но я, конечно, понимаю, что код не совсем верный):

@register.filter

def uglify(value):
    for i in value:
        if i % 2 == 0:
            i.upper()
        else:
            i.lower()             
    return value

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

Автор решения: Andrey Maslov

Строки в питоне не изменяемые. Поэтому тебе в цикле нужно собрать новую строку.

Если модифицировать твой код, получится как-то так:

@register.filter

def uglify(value):
    uglify_str = ""
    for i in value:
        if i % 2 == 0:
            uglify_str = uglify_str + i.upper()
        else:
            uglify_str = uglify_str + i.lower()     
    return uglify_str
→ Ссылка
Автор решения: Za Ars
@register.filter
def uglify(value: str):
    return ''.join(list(map(lambda x: x[1].upper() if x[0] % 2 else x[1].lower(), enumerate(value))))

Не претендую на лучший ответ, но любителям компактности пойдет

enumerate(value) будет возвращать по очереди номер и элемент под этим номером

map(func, iterable) проходится по всем элементам из iterable (пронумерованные элементы строки) и применяет к ним функцию func

lambda x: x[1].upper() if x[0] % 2 else x[1].lower() лямбда-функция для map, возвращает верхний/нижний регистр в зависимости от номера элемента

Так как map возвращает генератор - преобразуем в список через list() и объединяем символы в строку, через ''.join()

→ Ссылка