2015-10-18 120 views
0

如果我有两个字符串,如:对齐两个不同长度的不同字符串?

plaintext = "hello" 
key = "hi" 

我如何排列的字母(或其他字符,如空格和标点符号)一起足不出户的范围是多少?到目前为止,我正在这样做,但我一直跑到索引错误的字符串。

encryption = "" 
for index in range(len(plaintext)): 
    if plaintext[index] in alphabet: 
     encryption += vigenere_encrypt(plaintext[index], key[index]) 
    if plaintext[index] not in alphabet: 
     encryption += plaintext[index] 
return encryption 

我基本上是试图让我的钥匙匹配了明文的长度,使"hi" --> "hihih" 是相同的长度,“你好”,所以能都在同一时间循环而不运行到离范围错误

+0

你究竟想要达到什么目的?这两个字符串的预期输出是什么? – Mureinik

+0

你为什么在所有索引和什么是vigenere_encrypt? –

+0

我基本上试图让我的关键匹配与明文的长度,所以“嗨”应该成为“hihih”,这是“你好”相同的长度 –

回答

1

如果你希望你的短key串环绕,使用模数的索引它的时候:

encryption += vigenere_encrypt(plaintext[index], key[index % len(key)]) 

另一种方法是使用itertools.cycle作出所迭代或者在迭代时重复从key开始的值。然后,您可以使用zip(将两个序列组合使用比使用索引更多的Pythonic方式)与plaintext结合使用。这是一个版本,它可以在发生器表达式中完成整个加密:

import itertools 

encryption = "".join(vigenere_encrypt(plain_char, key_char) 
         if plain_char in alphabet else plain_char 
        for plain_char, key_char in zip(plaintext, itertools.cycle(key)) 
+0

非常感谢!这工作完美 –

+0

与连接的生成器表达式实际上更慢,并没有更多的空间效率,因为你将最终与列表无论 –

+0

我的意思是'str.join'可能会比在字符串上重复使用'+ ='效率更高,由于反复复制早期字符,(在一个幼稚的实现中)将会使用'O(N ** 2)'时间。因为初学者用'+ ='扩展字符串是很常见的事情,所以CPython在'str .__ add__'中有一些特殊的检查,如果没有其他的引用,它实际上会重用左边的参数而不复制它,但是我认为它是依靠这种优化是一个糟糕的主意。 – Blckknght

相关问题