Есть ли способ создать список символов, ord () их в целые числа, и hex () их в шестнадцатеричный код? - PullRequest
0 голосов
/ 08 апреля 2020

Я начинающий программист, использующий Python, и я пытаюсь создать программное обеспечение для шифрования (Beginner). Я ищу что-то вроде:

Ввод: Apple -> A, P, P, L, E -> ord () -> 97, "", "", "", "" -> hex () -> 0x16, "", "", "", ""

Однако я не могу найти способ перевести мои символы в целые числа при учете неизвестного количества символов на входе.

Sentence = list(input("Enter"))
print(Sentence)
ord_sentence = []
for each in range(len(Sentence)):
    ord_sentence.append(ord(Sentence[]))

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

...
...
while len(ord_sentence) <= len(Sentence)
   ord_sentence.append(ord(sentence[0]))
   ord_sentence.append(ord(sentence[1]))
##Continues on to 1000 to account for unknown input##

Но затем я сталкиваюсь с ОШИБКОЙ ИНДЕКСА, когда длина ввода не ровно 1000 символов, и выдает что-то вроде:

...
ord_sentence.append(ord(sentence[0]))
if IndexError:
    print(ord_sentence)
    break

Это приводит только к печати первый ди git последовательности, а затем разрыв.

Любая помощь будет принята с благодарностью! Спасибо !!!

Ответы [ 3 ]

0 голосов
/ 08 апреля 2020

Не используйте while l oop для этого. Если возможно, вам следует избегать использования индексов - это частый источник небольших ошибок и может затруднить чтение кода. Python позволяет очень легко l oop непосредственно над значениями. У вас должна быть действительно веская причина для использования:

for each in range(len(Sentence)):

вместо:

for a_char in Sentence:
  # use a_char here

, которая даст вам каждого персонажа по очереди

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

[a_char for a_char in s]

Вместе с объединением и вашими hex() и ord() функциями это становится очень кратким. Вы можете составить функцию как hex(ord('A')). С этим вы можете сделать понимание, которое будет обрабатывать строки любой длины, которую вы проходите:

s = "APPLE"

codedList = [hex(ord(c)) for c in s]
# ['0x41', '0x50', '0x50', '0x4c', '0x45']

# ... or:
codedstring = "".join(hex(ord(c)) for c in s)
# '0x410x500x500x4c0x45'
0 голосов
/ 08 апреля 2020

это делает то, что вы просили

s='APPLE';
l=list(s);
h=list(map(lambda x: '0x%x' % (ord(x)), l));
print(h);
0 голосов
/ 08 апреля 2020

Я думаю, вам нужно прочитать о том, как циклы снова работают. Когда вы перебираете что-то, значение присваивается переменной. В вашем коде это each. Вы никогда не используете эту переменную ни для чего, но я думаю, что это то, что вы ищете.

for each in range(len(Sentence)):
    ord_sentence.append(ord(Sentence[each]))

Итерирование по range и индексация, как вы делаете здесь, работает, но это не так прямо, как просто итерации по списку напрямую. Вместо этого вы можете сделать:

for each in Sentence:                   # no range, len, each is a character
    ord_sentence.append(ord(each))      # take its ord() directly

Или вы можете использовать понимание списка для создания нового списка непосредственно из старого, без отдельного l oop и набора вызовов append:

ord_sentence = [ord(each) for each in Sentence]

Несмотря на то, что each - это имя, которое вы использовали в своем коде, лучше присвоить переменным более точное c имя, которое сообщит вам, что означает значение. В первой версии здесь, где вы перебираете range, я бы использовал index, поскольку это то, что вы получаете (индекс в списке). Для двух других, value или character может иметь больше смысла, так как значение представляет собой один символ из списка Sentence. Говоря об этом списке, его название немного вводит в заблуждение, так как я ожидаю, что предложение будет строкой или, возможно, списком слов, а не списком символов (которые могут быть из более или менее одного предложения, например, ['f', 'o', 'o'] или ['F', 'o', 'o', '.', ' ', 'B', 'a', 'r', '.']).

...