2013-05-23 2 views
1

Я пытаюсь расшифровать стандарт «a = 1, b = 2, c = 3 ...» в Python, но я немного застрял. Мое сообщение, что я хочу расшифровать, это «он» - «8 5», но из-за упорядочения моих операторов if выход «eh». Кто-нибудь знает, как это решить?Python Расшифровка

import re 
import sys 
message = " 8 5 "; 
map(int, re.findall(r'\d+', message)) 
if "++" in message: 
    sys.stdout.write(" ") 
if "--" in message: 
    print() 
if " 1 " in message: 
    sys.stdout.write("a") 
if " 2 " in message: 
    sys.stdout.write("b") 
if " 3 " in message: 
    sys.stdout.write("c") 
if " 4 " in message: 
    sys.stdout.write("d") 
if " 5 " in message: 
    sys.stdout.write("e") 
if " 6 " in message: 
    sys.stdout.write("f") 
if " 7 " in message: 
    sys.stdout.write("g") 
if " 8 " in message: 
    sys.stdout.write("h") 
if " 9 " in message: 
    sys.stdout.write("i") 
if " 10 " in message: 
    sys.stdout.write("j") 
if " 11 " in message: 
    sys.stdout.write("k") 
if " 12 " in message: 
    sys.stdout.write("l") 
if " 13 " in message: 
    sys.stdout.write("m") 
if " 14 " in message: 
    sys.stdout.write("n") 
if " 15 " in message: 
    sys.stdout.write("o") 
if " 16 " in message: 
    sys.stdout.write("p") 
if " 17 " in message: 
    sys.stdout.write("q") 
if " 18 " in message: 
    sys.stdout.write("r") 
if " 19 " in message: 
    sys.stdout.write("s") 
if " 20 " in message: 
    sys.stdout.write("t") 
if " 21 " in message: 
    sys.stdout.write("u") 
if " 22 " in message: 
    sys.stdout.write("v") 
if " 23 " in message: 
    sys.stdout.write("w") 
if " 24 " in message: 
    sys.stdout.write("x") 
if " 25 " in message: 
    sys.stdout.write("y") 
if " 26 " in message: 
    sys.stdout.write("z") 
+2

Вы должны организовать коды в словаре, например: 'codes = {'21': 'u', '25': 'y'}' и так далее ... тогда вы делаете 'sys.stdout.write (коды [input]) ' –

+1

Вы должны изучить функцию' ord() ' – Matt

+0

, что сказал @SaulloCastro, за исключением того, что я бы программно сгенерировал этот словарь' import string' 'codes = {}' 'для элемента в string.ascii_lowercase : коды [string.ascii_lowercase.find (item) +1] = item ' – TehTris

ответ

3

Ваше решение не работает, потому что вы не смотрите на каждое число в строке ввода с самого начала, но для любого его появления.

Предположим, что ваш вход 8 5 8, ваш выход будет eh.

Вместо использования оператора in, вы должны иметь цикл среди всех чисел сообщения:

for code in map(int, re.findall("\d+", message)): 
    if code == 1: 
     sys.stdout.write("a") 
    -- ... and so on until 26 

Вы должны также использовать tipsgiven другими, которые состоят в использовании словаря кодов, чтобы избежать всех тех, if заявления.

6

Это становится намного проще, если вы используете отображение, а не ряд if заявлений:

>>> import string 
>>> d = {str(x):y for x,y in enumerate(string.ascii_lowercase,1)} 
>>> d['++'] = ' ' 
>>> d['--'] = '\n' 
>>> message = ' 8 5 ' 
>>> ''.join(d[x] for x in message.split()) 
'he' 

Здесь я использую все строки в качестве ключей к словарю, так как вы хотите, чтобы поддержать '++' и '--'.

+0

+1. 'message = '22 5 18 25 ++ 14 9 3 5'' –

+0

@StevenRumbalski - Спасибо :) – mgilson

0

Вместо того, чтобы делать то, что вы делаете сейчас, вы будете хотеть

  • расколоть message строку в каждый компонент (8 и 5 (или 11 по этому вопросу, и т.д.))
  • Iterate через каждый компонент в порядке ...
  • ... И «расшифровать» его значение в письме.

(Это map(int ... линия ничего не делает, кстати.)

2

Так это выглядит, как вы больше заинтересованы в том, почему ваш подход не работает, что получить краткое решение Постараюсь чтобы избежать более сложных методов приближения к этой проблеме (ASCII-сопоставления/словари и дать вам несколько указаний на то, как вы могли бы это сделать.

Во-первых, у вас есть сообщение, которое является строкой. Вы хотите посмотреть на каждую букву эту строку и найти правильную букву, которую она кодирует, поэтому вы захотите разобрать строку и посмотреть на нее по одной букве за раз, слева направо.

Вы можете использовать цикл for, чтобы получить письмо, а затем выполните сравнение с этой единственной буквой. Сделайте это по одной букве за раз и напишите вывод на каждом этапе.

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

Смежные вопросы