#python #arrays
Вопрос:
в настоящее время я работаю над шифром Playfair и немного застрял на разделении открытого текста. Мне нужно, чтобы они были длиной 2 символа, что было re.findall(r'.{1,2}',plaintext,re.DOTALL)
бы прекрасно, но мне нужно сравнить их друг с другом, и если они одного и того же персонажа, я должен изменить 2-й, что я не мог сделать с помощью этого метода. Я даже пытался вызвать каждый из них list
в for
цикле, он не возвращался с ошибкой, но и не работал
Очевидно char for char in word
, что и двойные for
петли будут работать, но я ищу немного более элегантное решение. Есть идеи?
Комментарии:
1. это пример, где
range(len())
может быть полезно.2. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
Ответ №1:
Использование регулярных выражений просто для сопоставления символов не очень эффективно. Вы можете получить тот же результат с подстроками в понимании:
bigrams = [plaintext[i:i 2] for i in range(0,len(plaintext),2)]
Чтобы найти индексы биграмм, идентичные их предшественнику, вы можете использовать zip:
dupIndexes = [ i for i,(a,b) in enumerate(zip(bigrams,bigrams[1:]),1) if a==b ]
Хотя я не уверен, что вы это имели в виду, учитывая, что шифр немного сложнее, чем это
Выход:
plaintext = "Have a banana" bigrams = [plaintext[i:i 2] for i in range(0,len(plaintext),2)] ['Ha', 've', ' a', ' b', 'an', 'an', 'a'] dupIndexes = [ i for i,(a,b) in enumerate(zip(bigrams,bigrams[1:]),1) if a==b ] [5]