有没有一种方法可以将字母转换为python中元组的索引?

时间:2020-07-01 16:22:40

标签: python indexing tuples

问题的意思是我是否有: alphabet:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] 并收到输入“ a”,我将从元组的索引中获取索引1或z来获取索引26。我想知道是否有比使用字典更简单的方法。 因此,就像我从字母表元组收到一项输入一样,它将返回索引。 我问这个问题是因为我正在创建一个简单的凯撒密码编码/解码器,我只想在索引中添加3,然后将其用于创建另一个变量,该变量的整个字母移位了索引3,因此“ a”变成“ d”和“ z”变为“ c”。

5 个答案:

答案 0 :(得分:1)

与C相同的技巧,假定使用英文字母:

idx = ord(x) - ord('a') + 1

(加号,因为您为值'a'请求了'1')

答案 1 :(得分:0)

string.ascii_lowercase已经按顺序具有所有字母(作为字符串),因此您可以定义以下函数:

from string import ascii_lowercase

def letter_position(letter: str) -> int:
    if len(letter) > 1:
        return 0
    return ascii_lowercase.find(letter.lower()) + 1

此函数可同时使用大写和小写字母,并且如果传递的不是单个字母,则返回0(因此'a'返回1,{{1} }返回'B',但是2'ab'都返回'!'):

0

答案 2 :(得分:0)

词典是前往此处的正确方法。您应该使用词典之外的函数处理任何“偏移”。

# secret coder
alphabet = list('abcdefghijklmnopqrstuvwxyz ')

# make dictionaries for encode / decode
key = {ltr:idx for idx, ltr in enumerate(alphabet)}
reverse_key = {idx:ltr for idx, ltr in enumerate(alphabet)}

# do the "tricky stuff" with a function

def encode(word, offset):
    result = []
    for letter in word:
        result.append(key[letter] + offset)
    return result

def decode(code, offset):
    result = []
    for num in code:
        result.append(reverse_key[num - offset])
    return ''.join(result)

# take it for a test drive...

secret_key = 5  # select anything you want, just use same for encode/decode

secret = encode('dog food', secret_key)
print(secret)

# get back the original w/ the secret key
retrieved = decode(secret, secret_key)
print(retrieved)

输出:

[8, 19, 11, 31, 10, 19, 19, 8]
dog food

答案 3 :(得分:0)

这是您的caeser密码:

from string import ascii_lowercase


def encode(s, offset):
    offset %= 26
    result = []
    for ch in s:
        substitute = ascii_lowercase.index(ch) + offset
        result.append(ascii_lowercase[substitute % 26])
    return ''.join(result)


def decode(s, offset):
    offset %= 26
    result = []
    for ch in s:
        original = ascii_lowercase.index(ch) - offset
        result.append(ascii_lowercase[original])
    return ''.join(result)


if __name__ == '__main__':
    s = 'abcdefwxyza'
    for i in range(-100, 100):
        assert(decode(encode(s, i), i) == s)

答案 4 :(得分:0)

要对字符串进行编码/解码,可以使用translate / make_trans创建密码。

from string import ascii_lowercase as lc, ascii_uppercase as uc


def encode(s, offset):
    return s.translate(
        str.maketrans(lc+uc,
                      lc[offset:]+lc[:offset]+uc[offset:]+uc[:offset]))

def decode(s, offset):
    return s.translate(
        str.maketrans(lc+uc,
                      lc[26-offset:]+lc[:26-offset]+uc[26-offset:]+uc[:26-offset]))

s = 'Hello World!'

encoded = encode(s, 3)
print(encoded)
decoded = decode(encoded, 3)
print(decoded)

打印

Khoor Zruog!
Hello World!