Здравствуйте, уважаемые друзья. Я написал код для нахождения ключа в Шифре Виженера, но возникла следующая ошибка:
<br/><blockquote>
a = (text_char_code[i] - chiper_char_code[i]) % len(alpha1)<br/>
~~~~~~~~~~~~~~^^^<br/>
TypeError: 'int' object is not subscriptable
</blockquote>
<br/> Я попробовал несколько вариантов с изменением типа переменной, но, к сожалению, это не помогло. Подскажите, пожалуйста, как разрешить эту проблему. Вот мой исходный код:
<br/><pre><code class="python">alpha1 = list('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')
text = 'имитостойкость'
cipher_text = 'щхыяяъеыъубюге'
key = " "
def get_key(text_char: str, i, cipher_char: str, alpha: list[str]) -> str:
if text_char not in alpha1: # Находит незнакомый символ и оставляет как есть
return text_char
text_char_code = alpha1.index(text_char) # Находит символ открытого текста
chiper_char_code = alpha1.index(cipher_char) # Находит символ зашифрованного текста
for i in text_char:
global a
a = (text_char_code[i] - chiper_char_code[i]) % len(alpha1) # Находит ключ
for i in range(len(text)):
key = key + str(get_key(text[i], i, cipher_text[i], alpha= alpha1)) #сохраняет ключ
print(key)</code></pre>
Ошибка `TypeError: 'int' object is not subscriptable` возникает, потому что вы пытаетесь использовать индексацию в переменной `text_char_code`, которая является целым числом (тип `int`). Зачем вы пытаетесь использовать `i` для индексации?
В данной ситуации `text_char_code` и `chiper_char_code` являются индексами символов в алфавите, и нет необходимости делать из них списки. Вместо этого вам нужно просто использовать их как целые числа.
Кроме того, в вашем коде есть некоторые другие моменты, которые стоит исправить:
1. Вызывать `get_key` с соответствующими параметрами.
2. Обновить логику получения ключа.
Вот исправленный код:
```python
alpha1 = list('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')
text = 'имитостойкость'
cipher_text = 'щхыяяъеыъубюге'
key = ""
def get_key(text_char: str, cipher_char: str, alpha: list[str]) -> str:
if text_char not in alpha: # Находит незнакомый символ и оставляет как есть
return text_char
text_char_code = alpha.index(text_char) # Находит символ открытого текста
chiper_char_code = alpha.index(cipher_char) # Находит символ зашифрованного текста
a = (text_char_code - chiper_char_code) % len(alpha) # Находит ключ
return alpha[a] # Возвращает символ ключа
for i in range(len(text)):
key += str(get_key(text[i], cipher_text[i], alpha=alpha1)) # сохраняет ключ
print(key)
```
Изменения и пояснения:
- В функции `get_key` теперь не используется индекс `i`, потому что `text_char_code` и `chiper_char_code` уже являются индексами символов. Вместо этого используется простое вычитание.
- Возвращается символ, соответствующий вычисленному индексу `a`.
- Вместо `global a` определение `a` теперь локально в функции. Это более читаемо и правильно.
- В итоге `key` формируется правильно.
Теперь ваш код должен работать без ошибок и возвращать ожидаемый результат.
Учись отладке, сделай перед строкой с ошибкой print(text_char_code) и помедитируй над выводом. Ну текст ошибки достаточно ясно описывает проблему, просто переведи его