Разделите строку на 2 массива длиной в символ

#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]