Проблема с форматированием списков

У меня есть эта функция, которая принимает имя в качестве входных данных, помещает его в список и затем запускает ord() для него. Тем не менее, у меня есть некоторые (во что я верю) проблемы с форматированием. Я пытаюсь заставить его выглядеть так:

b = (ascii value)
a = (ascii value)
t = (ascii value)
m = (ascii value)
a = (ascii value)
n = (ascii value)

У меня имя отображается правильно, однако значение ascii выглядит следующим образом:

b = [98, 97, 116, 109, 97, 110]
a = [98, 97, 116, 109, 97, 110]
t = [98, 97, 116, 109, 97, 110]
m = [98, 97, 116, 109, 97, 110]
a = [98, 97, 116, 109, 97, 110]
n = [98, 97, 116, 109, 97, 110]

Не уверен, где я иду не так, ниже приведен код, который я сделал для него:

def x():
     name = requestString("name")
     usersName = list(name)
     ascii = [orc(c) for c in usersName]
     for name in name: 
          print name, "=", ascii 

Спасибо!

редактировать: спасибо, это действительно ценится. Получите, где я пошел не так сейчас!

5 ответов

Решение

Вот небольшой обзор того, где вы ошиблись:

def x():
     name = requestString("name")
     usersName = list(name)
     ascii = [orc(c) for c in usersName] # here's the list
     for name in name: 
          print name, "=", ascii # and you're printing it here everytime

Вы можете исправить более питонически, как это:

def x():
     name = requestString("name")
     # usersName = list(name) # no need for this line, you can iterate over the string
     ascii = [orc(c) for c in name] #so this is just name
     for i, c in enumerate(name):  # use c for your character var name, 
          print c, "=", ascii[i]   # and enumerate provides the index

Так как вы ничего не возвращаете, создание списка не требуется, вы также можете предоставить ord(c) на лету:

def print_ords_of_word(name):
    for c in name:
        print c, '=', ord(c)

ascii это список ord для всех персонажей. Чтобы соединить их с символами, которые они представляют, используйте zip:

for num, char in zip(ascii, name):
    print "'{0}'={1}".format(char, num)

Вы можете сделать это за один цикл:

for item in name:
    print item, "=", ord(item)

Демо-версия:

>>> def x(name):
...      for item in name:
...           print item, "=", ord(item)
... 
>>> x('batman')
b = 98
a = 97
t = 116
m = 109
a = 97
n = 110

Вы получаете список обратно, потому что вы использовали понимание списка, чтобы преобразовать все usersName в список ордов. Это может быть записано в одну строку с:

print "\n".join("{0} = {1}".format(c, ord(c)) for c in name)

Метод соединения со строкой принимает последовательность или итератор и разделяет каждый элемент исходным содержимым строки (в данном случае \n).

Цикл for внутри вызова join создает генератор, который можно рассматривать как понимание списка, если он помогает лучше понять (но на самом деле это не так).

[ord(c) for c in usersName] это список всего ord значения для букв в usersName, Это не то, что вы хотите поместить рядом с вашим письмом - вы хотите поставить ТОЛЬКО ТО, которое.

Вы можете сделать это:

def x():
    name = requestString("name")
    ascii = {letter:ord(letter) for letter in name}
    for letter in name:
        print(letter+" = "+ascii[letter])
        # or use string formatting which is better

Или просто:

def x():
    name = requestString("name")
    for letter in name:
        print(letter+" = "+ord(letter))
Другие вопросы по тегам