2015-10-18 122 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

相關問題