ValueError:未找到子字符串有什么问题?

2024-06-02 03:13:42 发布

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

    from caesar import Caesar
    from string import ascii_lowercase as lc, ascii_uppercase as uc

    class Vigenere:
        def __init__(self, key: str):
            self.key = key
            self.ignore_chrs = ".,:;!?'- "

        def encode(self, text: str) -> str:
            if len(self.key) > len(text):
                text += text[:len(self.key)-len(text)]
            elif len(text) > len(self.key):
                self.key += self.key[:len(text)-len(self.key)]
            else:
                assert len(self.key) == len(text)
    
            enc_txt = ""
            for _chr in text:
                if _chr in self.ignore_chrs:
                    enc_chr = _chr
                elif _chr.islower():
                    caesar = Caesar(shift=lc.index(self.key[text.index(_chr)]))
                    enc_chr = caesar.encode(_chr)     
                else:
                    caesar = Caesar(shift=uc.index(self.key[text.index(_chr)]))
                    enc_chr = caesar.encode(_chr)
                enc_txt += enc_chr
            return enc_txt 

我使用了Caesar(在这段代码中没有错误或bug。)加密来加密Vigenere加密。但运行代码时会出现“ValueError:substring not found”错误。每封信我都叫“凯撒”班。我能一次叫“凯撒”班来操作所有这些代码吗?如果我能呢

…\Desktop\Python Projects\vigenere.py”,第25行,编码 caesar=caesar(shift=uc.index(self.key[text.index(_chr)]) ValueError:未找到子字符串 在这里,我得到了完整的追踪


Tags: key代码textselftxtindexlenshift
1条回答
网友
1楼 · 发布于 2024-06-02 03:13:42

从字符串(https://docs.python.org/3/library/stdtypes.html#common-sequence-operations)上的文档:

index raises ValueError when x is not found in s

因为我们不能根据你给出的告诉你text_chrkey的值,所以我们只能告诉你这么多。要对此进行调试,您可以使用简单的print()语句打印出上述值,并找出哪个值不正确

使代码更健壮的另一个选项是更改if块。您有一个else块,它实际上不是一个“else”,因为它处理大写字母。考虑以下事项:

elif _chr.isupper():
  caesar = Caesar(shift=uc.index(self.key[text.index(_chr)]))
  enc_chr = caesar.encode(_chr)
else:
  raise ValueError(f'Unexpected character: {_chr}')

相关问题 更多 >