简体   繁体   中英

How do I make python accept both upper and lower case letters

My friends and I have had "encrypted" conversations like this for some time now. The goal is for the program to take either the encrypted message and make it so anyone can read it and vice-versa. However, if I use uppercase letters it does not change them. How do I fix it?

VOWELS = ["a", "e", "i", "o", "u"]
CONSONANTS = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"]

def encrypt(message: str):
    encryptedMessage = ""
    for letter in message:
        
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) + 1
            if newIndex >= len(VOWELS):
                newIndex = 0
            encryptedMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) + 1
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            encryptedMessage += CONSONANTS[newIndex]

        else:
            encryptedMessage += letter

    return encryptedMessage

def decrypt(message: str):
    decryptedMessage = ""
    for letter in message:
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) - 1
            if newIndex >= len(VOWELS):
                newIndex = 0
            decryptedMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) - 1
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            decryptedMessage += CONSONANTS[newIndex]

        else:
            decryptedMessage += letter

    return decryptedMessage
    
def better_encryption(message: str, is_encrypt: bool):

    newMessage = ""
    ed = 1 if is_encrypt else -1
    
    for letter in message:
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) + ed 
            if newIndex >= len(VOWELS):
                newIndex = 0
            newMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) + ed
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            newMessage += CONSONANTS[newIndex]

        else:
            newMessage += letter

    return newMessage    

def main():

    while True:
        command = str(input("[E]ncrypt or [D]ecrypt? "))

        if "E" in command.upper() :
            print(better_encryption(input("Message: "), True))

        elif "D" in command.upper() :
            print(better_encryption(input("Message: "), False))

        else:
            print("Invalid")

A simple letter = letter.lower() in appropriate places should do what you want:

VOWELS = ["a", "e", "i", "o", "u"]
CONSONANTS = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"]

def encrypt(message: str):
    encryptedMessage = ""
    for letter in message:
        letter = letter.lower()
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) + 1
            if newIndex >= len(VOWELS):
                newIndex = 0
            encryptedMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) + 1
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            encryptedMessage += CONSONANTS[newIndex]

        else:
            encryptedMessage += letter

    return encryptedMessage

def decrypt(message: str):
    decryptedMessage = ""
    for letter in message:
        letter = letter.lower()
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) - 1
            if newIndex >= len(VOWELS):
                newIndex = 0
            decryptedMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) - 1
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            decryptedMessage += CONSONANTS[newIndex]

        else:
            decryptedMessage += letter

    return decryptedMessage
    
def better_encryption(message: str, is_encrypt: bool):

    newMessage = ""
    ed = 1 if is_encrypt else -1
    
    for letter in message:
        letter = letter.lower()
        if letter in VOWELS:
            newIndex = VOWELS.index(letter) + ed 
            if newIndex >= len(VOWELS):
                newIndex = 0
            newMessage += VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = CONSONANTS.index(letter) + ed
            if newIndex >= len(CONSONANTS):
                newIndex = 0
            newMessage += CONSONANTS[newIndex]

        else:
            newMessage += letter

    return newMessage    

def main():

    while True:
        command = str(input("[E]ncrypt or [D]ecrypt? "))

        if "E" in command.upper() :
            print(better_encryption(input("Message: "), True))

        elif "D" in command.upper() :
            print(better_encryption(input("Message: "), False))

        else:
            print("Invalid")

I also made a few improvements to your code.
you may change encrypt and decrypt similarly.

VOWELS = [ord(c.upper()) for c in ["a", "e", "i", "o", "u"]]
CONSONANTS = [ord(c.upper()) for c in ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"]]
# save letters' UPPER_CASE corresponding ascii number

LOWER_CONST = 0x20
UPPER_MASK  = 0xff ^ LOWER_CONST
# we assume all strings are ascii
# in ascii, UPPER_CASE English letters are ORed with 0x20 (32)
# to produce lower_case letters

def better_encryption(message: str, is_encrypt: bool):
    newMessage = ""
    ed = 1 if is_encrypt else -1
    
    for letter in message:
        res = None

        letter = ord(letter) # convert letter to corresponding ascii number
        case = letter & LOWER_CONST # we save letter's sixth bit
        letter &= UPPER_MASK # we set letter's sixth bit to zero, while keeping the other seven bits unchanged

        if letter in VOWELS:
            newIndex = (VOWELS.index(letter) + ed) % len(VOWELS) # mod operation handles cyclic shift
            res = VOWELS[newIndex]

        elif letter in CONSONANTS:
            newIndex = (CONSONANTS.index(letter) + ed) % len(CONSONANTS) # mod operation handles cyclic shift
            res = CONSONANTS[newIndex]

        else:
            res = letter # keep the letter unchanged
        
        res |= case # restore letter's sixth bit
        newMessage += chr(res) # convert res from number to corresponding ascii letter

    return newMessage    

def main():
    while True:
        command = input("[E]ncrypt or [D]ecrypt? ")

        if len(command) == 0: # if user inputs empty string, we may not access the first character
            continue
        
        if command[0].upper() == 'E':
            print(better_encryption(input("Message: "), True)) #encrypt the message

        elif command[0].upper() == 'D':
            print(better_encryption(input("Message: "), False)) #decrypt the message

        else:
            print("Invalid Command")

if __name__ == "__main__":
    main()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM