问题的意思是我是否有:
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”。
答案 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!