#python #ascii #chr
#python #ascii #chr
Вопрос:
Часть, в которой мне нужно перейти от полученных числовых значений к символам, чтобы записать слово, которое не работает, в нем говорится, что мне нужно использовать целое число для последней части?
принять строку
print "This program reduces and decodes a coded message and determines if it is a palindrome"
string=(str(raw_input("The code is:")))
измените его на нижний регистр
string_lowercase=string.lower()
print "lower case string is:", string_lowercase
удалить специальные символы
specialcharacters="1234567890~`!@#$%^amp;*()_- ={[}]|:;'<,>.?/"
for char in specialcharacters:
string_lowercase=string_lowercase.replace(char,"")
print "With the specials stripped out the string is:", string_lowercase
смещение ввода
offset=(int(raw_input("enter offset:")))
преобразование текста в код ASCII
result=[]
for i in string_lowercase:
code=ord(i)
result.append([code-offset])
преобразование кода ASCII в текст
text=''.join(chr(i) for i in result)
print "The decoded string is:", text.format(chr(result))
Комментарии:
1. Что вы подразумеваете под «не работает»? Кроме того, для части «strip special characters» я бы
string_lowercase = [x for x in string_lowercase in x in string.ascii_letters]
выбрал, предполагая, что вы использовалиimport string
ранее. Наконец, не называйте свою переменнуюstring
.2. «Часть […] не работает» . Что это за часть, и почему вы показываете нам так много других частей, сбивая меня с толку в том, в чем проблема? Лучше просто показать и спросить о первой части, которая делает что-то не так. (Более поздние части могут сделать что-то не так только потому, что они получают уже неправильные данные.)
Ответ №1:
Похоже, что при вызове у вас есть список списков вместо списка целых result.append([code-offset])
чисел. Это означает, что позже, когда вы вызываете chr(i) for i in result
, вы передаете список вместо int chr()
.
Попробуйте изменить это на result.append(code-offset)
.
Другие небольшие предложения:
raw_input
уже дает вам строку, поэтому нет необходимости явно приводить ее.-
Ваше удаление специальных символов может быть более эффективно записано как:
special_characters = '1234567890~`!@#$%^amp;*()_- ={[}]|:;'<,>.?/' string_lowercase = ''.join(c for c in string_lowercase if string not in special_characters)
Это позволяет вам выполнять итерацию только
string_lowercase
один раз, а не по символуspecial_characters
.
Ответ №2:
При выполнении .append()
списка используйте code-offset
вместо [code-offset]
. Как и в дальнейшем, вы сохраняете значение в виде списка (из одного ASCII) вместо того, чтобы сохранять значение ASCII напрямую.
Следовательно, ваш код должен быть:
result = []
for i in string_lowercase:
code = ord(i)
result.append(code-offset)
Однако вы можете упростить этот код следующим образом:
result = [ord(ch)-offset for ch in string_lowercase]
Вы можете еще больше упростить свой код. Одна строка для получения декодированной строки будет:
decoded_string = ''.join(chr(ord(ch)-offset) for ch in string_lowercase)
Пример со смещением как 2:
>>> string_lowercase = 'abcdefghijklmnopqrstuvwxyz'
>>> offset = 2
>>> decoded_string = ''.join(chr(ord(ch)-offset) for ch in string_lowercase)
>>> decoded_string
'_`abcdefghijklmnopqrstuvwx'
Ответ №3:
Вы передаете список chr
, когда он принимает только целые числа. Попробуйте result.append(code-offset)
. [code-offset]
это список из одного элемента.
В частности, вместо:
result=[]
for i in string_lowercase:
code=ord(i)
result.append([code-offset])
использовать:
result=[]
for i in string_lowercase:
code=ord(i)
result.append(code-offset)
Если вы понимаете понимание списка, это тоже работает: result = [ord(i)-offset for i in string_lowercase]