打印关键字,如果满足条件,则打印关键字值

2024-10-03 04:34:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建简单的“编码脚本”

我有这本字典:

diction =  {
"A" :  "Z", 
"Y" :  "B",
"C" :  "X"
}

我想给出一些随机的句子,重复它的字母,如果在这本字典中找到字母-打印相反的字母
所以,如果我说

"ABC"

它应返回:

"ZYX"

我尝试了此代码,但出现了一个“KeyError”:

# Defining dictionary
diction =  {
"A" :  "Z", 
"Y" :  "B",
"C" :  "X",
"W" :  "E",
"E" :  "V",
"U" :  "F",
"G" :  "T",
"S" :  "H",
"I" :  "R",
"Q" :  "J",
"K" :  "P",
"O" :  "L",
"M" :  "N",
" " :  " "
}

# Sentence in "szyfr" variable should be split into list.

szyfr = "SOME SENTENCE WHATEVER"

def split(szyfr): 
     return [char for char in szyfr]

szyfr = split(szyfr)


# Now I want to iterate through "szyfr" and replace letters as in "CAT" example:  

for i in szyfr:
        if i in diction:
                
                diction = {x:y for x,y in diction.items()}
                print(i)
                print("Variable: " + i + " is in 'key'")
                pass
        elif diction[i] in szyfr:
                diction = {y:x for x,y in diction.items()}
                print(i)
                print("Variable: " + i + " is in 'value'")
        elif i is " ":
                pass

print(szyfr)


Tags: in编码for字典is字母itemspass
3条回答

如果您确实想使用一个dict,其中每个键的“字母”都有“相反字母”的值:

这是一个可能的解决方案:

diction = {" ": " "}

all_letters = range(ord('A'), ord('Z')+1)
for char, opsite_char in zip(all_letters, reversed(all_letters)):
    diction[chr(char)] = chr(opsite_char)

print(diction)

输出:

{' ': ' ', 'A': 'Z', 'B': 'Y', 'C': 'X', 'D': 'W', 'E': 'V', 'F': 'U', 'G': 'T', 
'H': 'S', 'I': 'R', 'J': 'Q', 'K': 'P', 'L': 'O', 'M': 'N', 'N': 'M', 'O': 'L', 
'P': 'K', 'Q': 'J', 'R': 'I', 'S': 'H', 'T': 'G', 'U': 'F', 'V': 'E', 'W': 'D', 
'X': 'C', 'Y': 'B', 'Z': 'A'}

根据您提供的代码,我发现以下奇怪之处:

szyfr = "SOME SENTENCE WHATEVER"

def split(szyfr): 
     return [char for char in szyfr]

szyfr = split(szyfr)

似乎您正在尝试从字符串构建列表,可以简单地如下所示:

>>> s = "hola"
>>> l1 = list(s)
>>> l1
['h', 'o', 'l', 'a']

因此,在您的具体案例中:

szyfr = "SOME SENTENCE WHATEVER"
szyfr = list(szyfr)

不过,实际上并不需要它,因为您可以直接管理字符串,就像它是一个列表一样,使用for

现在,您需要替换特定字典后面的字符。我发现您的解决方案太复杂,而您只需要:

diction =  {
"A" :  "Z", 
"Y" :  "B",
"C" :  "X",
"W" :  "E",
"E" :  "V",
"U" :  "F",
"G" :  "T",
"S" :  "H",
"I" :  "R",
"Q" :  "J",
"K" :  "P",
"O" :  "L",
"M" :  "N",
" " :  " "
}

sentence_to_code = input("Give me a sentence: ").strip().upper()
toret = ""

for ch in sentence_to_code:
    coded_ch = diction.get(ch)

    if not coded_ch:
        coded_ch = ch

    toret += coded_ch

print(toret)

如果您没有为所有可能的字符定义对应符,那么使用字典的get(k)方法是明智的,该方法在未找到键k时返回None

必须考虑到,get(k)方法在找不到键的情况下具有返回值的默认参数,因此您可以使用get(k,default_return_value),这让我们可以进一步简化代码:

diction =  {
"A" :  "Z", 
"Y" :  "B",
"C" :  "X",
"W" :  "E",
"E" :  "V",
"U" :  "F",
"G" :  "T",
"S" :  "H",
"I" :  "R",
"Q" :  "J",
"K" :  "P",
"O" :  "L",
"M" :  "N",
" " :  " "
}

sentence_to_code = input("Give me a sentence: ").strip().upper()
toret = "".join([diction.get(ch, ch) for ch in sentence_to_code])

print(toret)

现在我们使用列表理解,因为我们不再需要条件。调用diction.get(ch, ch)返回ch或相应的编码字符,如果在字典中找不到,则返回ch本身。通过调用str.join(),即"".join(...),我们将列表转换回字符串

您缺少一些字母,例如N。请注意{"M": "N"}{"N": "M"}不同

也就是说,你甚至不需要字典,就好像你从155(65+65+26-1)中减去一个大写字母的ASCII code(例如a的65),你将得到相应字母的ASCII码:

>>> szyfr = "SOME SENTENCE WHATEVER"
>>> "".join(chr(155-ord(e)) if "A" <= e <= "Z" else e for e in szyfr)
'HLNV HVMGVMXV DSZGVEVI'

相关问题 更多 >