Строка «Зашифровать», если в словаре появляется символ - PullRequest
0 голосов
/ 30 июня 2019

У меня проблема со словарями.

Итак, мой словарь содержит символ в алфавите в качестве ключа и число в качестве значения.

Мне нужно ввести строку, а затем, если в моем словаре появляется символ этой строки, мне нужно заменить этот символ значением соответствующего ключа.

Так, например, это мой словарь: a:1, b:2, c:3, d:4. Для такой строки: dan я получу вывод: 41n.

Если буква отсутствует в словаре, то она остается такой, как есть.

Это моя попытка:

    def build_encrypt_code():
        d1 = {}
        dictLength = int(input("How many keys do you want in your dict? "))
        for i in range(dictLength):
            keyLetter = str(input("Please enter a char to represent a key: "))
            valueNum = int(input("please enter a number to represent the key's value: "))
            d1[keyLetter] = valueNum
        return d1

    def encrypt(d1, strToEncrypt):
        for i in strToEncrypt:
            if i == d1.keys():
                encrpytedStr = strToEncrypt.replace(i, d1[i])
                return encrpytedStr
            else:
                return i

    d1 = build_encrypt_code()
    strToEncrypt = str(input("Enter string to encrypt: "))
    print(encrypt(d1, strToEncrypt))
  1. Я спрашиваю пользователя, как долго он хочет, чтобы диктовка была, и создаю словарь
  2. Я спрашиваю char как ключ и num как соответствующее значение
  3. Я шифрую полученную строку, проверяя, находится ли она в d1.keys()
  4. Затем я вызываю все функции, чтобы вернуть зашифрованную строку

Я не уверен, где я не прав. Любая помощь будет великолепна.

1 Ответ

0 голосов
/ 30 июня 2019

Я сделал два изменения в вашем коде.

1. При первом редактировании вы можете анализировать ключи и значения, не спрашивая пользователя, сколько он хочет, используя while True и останавливаяпри поиске команды выхода (например, строка stop).

Существует также проверка длины (keyLetter - это один символ, valueNum - это одна цифра, благодаря двум while len() != 1, побуждающим пользователя снова ввести значение, если они потерпели неудачу раньше)

Это субъективно ;если вам нужен фиксированный размер, используйте код.

def build_encrypt_code():
    d1 = {}
    exitCmd = 'stop'
    print('Enter {} to interrupt parsing'.format(exitCmd))

    while True:
        keyLetter = ''
        while len(keyLetter) != 1:
            keyLetter = str(input("Please enter a char to represent a key: "))
            if keyLetter.lower() == exitCmd:
                break

        valueNum = ''
        while len(str(valueNum)) != 1:
            valueNum = int(input("please enter a digit to represent the key's value: "))

        d1[keyLetter] = valueNum

    return d1

2. Второе редактирование, однако, обязательно , и в этом месте происходит сбой программного обеспечения.

def encrypt(d1, strToEncrypt):
    for i in strToEncrypt:
        if i == d1.keys():
            encrpytedStr = strToEncrypt.replace(i, d1[i])
            return encrpytedStr
        else:
            return i

В этой функции вы циклически переключаетесь между всеми символами в вашей строке (i является символом), а затем сравниваете символ сKeysView.Кроме того, вы затем возвращаетесь в if, но при этом он будет выполнять только цикл, а затем прерываться (и, поскольку условие if всегда ложно, ваш encryptedStr всегда будет вашим первым символом).

Это рабочий код для функции шифрования:

def encrypt(d1, strToEncrypt):
    encryptedStr = strToEncrypt

    for char in strToEncrypt:
        if char in d1.keys():
            encryptedStr = encryptedStr.replace(char, str(d1[char]))

    return encryptedStr

Мы циклически повторяем каждый символ, и если это in KeysView, вы можете заменить этот символ строковой версией своего номера (связанной с этим символом).), а затем в конце for вы можете вернуть зашифрованную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...