Как увеличить переменную внутри понимания списка - PullRequest
0 голосов
/ 18 января 2020

У меня есть функция python, которая увеличивает символ на 1 значение ascii, если индекс нечетный, и уменьшает значение ascii на 1, если индекс четный. Я хочу преобразовать его в функцию, которая выполняет те же операции увеличения и уменьшения но в следующем наборе я хочу увеличить на 2, а затем уменьшить на -2, затем на 3 и -3 и т. д.

Что я пытаюсь сделать, так это увеличивать переменную счетчика на 1 каждый раз, когда четный индекс появляется после выполнения декрета ascii.

Я также не хочу делать это с for l oop, есть ли способ сделать это в самом понимании списка?

В моей функции, если вход

input: 'abcd' output: is 'bad c' то, что я хочу, это 'baeb'

input: 'cgpf' output: это 'dfqe' то, что я хочу, это 'dfrd'

def changer(s):
    b=list(s)
    count=1
    d=[chr(ord(b[i])+count) if i%2==0  else chr(ord(b[i])-count) for i in range(0,len(b))]
    return ''.join(d)

Мне нужно что-то вроде count++, как показано, но, к сожалению python не поддерживает его.

def changer(s):
    b=list(s)
    count=1
    d=[chr(ord(b[i])+count) if i%2==0  else chr(ord(b[i])-count++) for i in range(0,len(b))]
    return ''.join(d)

Вот исполняемый код

Ответы [ 3 ]

6 голосов
/ 18 января 2020

Если я правильно понял, что вы ищете, что-то вроде этого (компактная форма) должно сделать:

def changer(s):
    return "".join(chr(ord(c) + ((i // 2) + 1) * (-1 if i % 2 else 1))
                   for i, c in enumerate(s))

Мы получаем индекс и символ из строки с помощью enumerate() и используем это для подачи понимание генератора (как было запрошено) далеко от индекса (i) и символа (c) из строки.

Для каждого значения ASCII c мы добавляем результат целочисленного деления i (увеличивается на единицу, поскольку индекс основывается на 0) на 2 и умножается на (-1 if i % 2 else 1), что отражает +/- на основе четного / нечетного числа: умножается на -1 при модуляции i делении на 2 не равен нулю (а bool() оценивается как True), в противном случае используйте 1.

Нет необходимости говорить: такое понимание не обязательно легко читать, поэтому, если вы будете использовать его в ваш сценарий, он заслуживает хорошего комментария для дальнейшего использования. ;)

3 голосов
/ 18 января 2020

Объедините поток плюс / минус со строкой.

import itertools
s = 'abcdefg'

x = range(1,len(s)+1)
y = range(-1,-len(s)+1,-1)
z = itertools.chain.from_iterable(zip(x,y))
r = (n + ord(c) for (n,c) in zip(z,s))
''.join(chr(n) for n in r)

Не думаю, что я бы попытался поместить все это в одну строку. Использует генераторные выражения вместо списочных.

2 голосов
/ 18 января 2020

Попробуйте код ниже,

def changer(s):
    return ''.join([chr(ord(j) + (i // 2 + 1)) if i % 2 == 0 else chr(ord(j) - (i // 2 + 1)) for i, j in enumerate(s)])

s = 'abcd'
changer(s)

вывод

baeb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...