перебирая список для увеличения на 'x' и создавая новый список - PullRequest
1 голос
/ 05 марта 2020

Я новичок python и пытаюсь создать простой шифр, в котором я перебираю один список, а затем увеличиваю на 3, чтобы создать новый список, но продолжаю получать ошибку типа. lower_list = список из abcd ..... z

И когда я выполняю следующее, появляется ошибка типа:

    for i in lower_list:
        shift_lower += lower_list[i:i+3]

Кто-нибудь предлагает какие-либо советы о том, как это можно сделать синтаксически правильным? спасибо.

Ответы [ 3 ]

1 голос
/ 05 марта 2020

Вы пытаетесь это сделать.

lower_list=['a','b',...,'z']
cipher_text=[chr(ord(i)+3) for i in lower_list]

['d',
 'e',
 'f',
 ...
 'z',
 '{',
 '|',
 '}']

РЕДАКТИРОВАТЬ:

Когда домен и диапазон символов a-z ( для краткости я рассматриваю строчные буквы az). Это пример Caeser Cipher .

<b>C.T=(P.T+K)Mod26</b>

Реализация:

lower_list=['a', 'b' ,'c', ..., 'z']
cipher_text=[chr((ord(s) + incr - 97) % 26 + 97)  for s in lst]

Вы можете создать функцию для обработки как шифрования, так и дешифрования. Я бы сделал это так.


def caeser_cipher(lst,<b>incr</b>,<b>encrypt</b>=True):
    if encrypt:
        return [<b>chr((ord(s) + incr - 97) % 26 + 97)</b>  for s in lst]
    else:
        return [<b>chr((ord(s) - incr - 97) % 26 + 97)</b>  for s in lst]

lower_letters=['a','b', ...'z']
cipher_text=caeser_cipher(lower_letters,4)
#['e', 'f', 'g', 'h', ... ,'c', 'd']
plain_text=caeser_cipher(cipher_text,4,encrypt=False)
# ['a', 'b', 'c', ...,'z']
0 голосов
/ 05 марта 2020

Нет необходимости в list для перебора символов строки.
Так что я думаю, что вам нужно что-то вроде этого:

cipher = 3 # You could use a different cipher value
message = 'This is an example of Caesars Cipher!'
encrypted = ''.join(chr(ord(char) + cipher) for char in message)
decrypted = ''.join(chr(ord(char) - cipher) for char in encrypted)
print(encrypted)
print(decrypted)

Этот код выводит:

Wklv#lv#dq#h{dpsoh#ri#Fdhvduv#Flskhu$
This is an example of Caesars Cipher!
0 голосов
/ 05 марта 2020
from string import ascii_lowercase


def encode(original_text: str) -> str:
    return ''.join(
        ascii_lowercase[(ascii_lowercase.index(c) + 3) % len(ascii_lowercase)]
        if c in ascii_lowercase else c
        for c in original_text
    )


print(encode('test xyz'))

вывод:

whvw abc

Или вы можете построить карту конвертации для него:

from string import ascii_lowercase


convert_dict = {
    c: ascii_lowercase[(ascii_lowercase.index(c) + 3) % len(ascii_lowercase)]
    for c in ascii_lowercase
}


def encode(original_text: str) -> str:
    return ''.join(
        convert_dict[c]
        if c in convert_dict else c
        for c in original_text
    )


print(encode('test xyz'))
...