Создание фильтра в 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 шт):
Строки в питоне не изменяемые. Поэтому тебе в цикле нужно собрать новую строку.
Если модифицировать твой код, получится как-то так:
@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
@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()