Преобразование числовых значений в символы ascii?

#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]