Как исправить ошибку TypeError: 'int' object is not subscriptable, возникшую в списке?

Здравствуйте, уважаемые друзья. Я написал код для нахождения ключа в Шифре Виженера, но возникла следующая ошибка: 
<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]) -&gt; 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>
  • 13 ноября 2024 г. 0:33
Ответы на вопрос 2
Ошибка `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) и помедитируй над выводом. Ну текст ошибки достаточно ясно описывает проблему, просто переведи его
Похожие вопросы