<p>根据其他人的回答,你是在用一个索引的东西来删除好的旧的。一个可能的解决方案是根本不做任何索引篡改:</p>
<pre><code># Let's put this line out of the for loop to prevent clearing changes every iteration
sOutput = sString
for current_item, next_item in zip(encrypts, encrypts[1:]):
sOutput = sOutput.replace(current_item, next_item)
</code></pre>
<p><code>zip</code>获取两个iterable,并返回包含每个iterable的一项的元组,在最短iterable用尽时结束。通过用<code>encrypts[1:]</code>压缩<code>encrypts</code>,可以得到一系列元组,其中包含<code>encrypts</code>中的相邻元素。你知道吗</p>
<p>如果<code>encrypts</code>相当大,那么使用<code>itertools</code>模块中的<code>izip</code>会更高效。使用<code>izip</code>就像使用<code>zip</code>一样,它将返回一个延迟计算的生成器对象,而不是首先创建整个元组列表。你知道吗</p>
<p><strong>编辑:</strong>好再次检查您的代码时,它有几个根本错误。我上面的内容复制了您的代码所做的操作而不产生索引错误,但是您的代码所做的实际上是不正确的。实际上,您需要将第一项与第二项、第三项与第四项等配对,而您当前正在将第一项与第二项、第二项与第三项、第三项与第四项等配对</p>
<p>下面是加密的方法:</p>
<pre><code>for odd_elem, even_elem in zip(encrypts[::2], encrypts[1::2]):
sOutput = sOutput.replace(odd_elem, even_elem)
</code></pre>
<p>或者像@padraic cunningham所说的,使用dict,因为你一次加密一个字符。下面是加密的方法:</p>
<pre><code>encrypt_dict = dict(zip(encrypts[0::2], encrypts[1::2]))
sOutput = ''.join(encrypt_dict[char] for char in sString)
</code></pre>
<p>使用dicts进行解密比较困难,因为您没有将所有内容都加密为3个数字(空格转换为“-”)。它仍然是可行的,首先在'-'上拆分,然后进一步分块为3个数字,每个数字,然后通过一个解密dict运行它。或者你可以根据@padraic cunningham将空格转换成'--'。你知道吗</p>