String indices must be integers python ошибка

На чтение 4 мин Просмотров 18.1к. Опубликовано 30.04.2021

В этой статье мы рассмотрим из-за чего возникает ошибка TypeError: String Indices Must be Integers и как ее исправить в Python.

Содержание

  1. Введение
  2. Что такое строковые индексы?
  3. Индексы строки должны быть целыми числами
  4. Примеры, демонстрирующие ошибку
  5. Использование индексов в виде строки
  6. Использование индексов в виде числа с плавающей запятой
  7. Решение для строковых индексов
  8. Заключение

Введение

В Python мы уже обсудили множество концепций и преобразований. В этом руководстве обсудим концепцию строковых индексов, которые должны быть всегда целыми числами. Как знаем в Python, доступ к итеративным объектам осуществляется с помощью числовых значений. Если мы попытаемся получить доступ к итерируемому объекту, используя строковое значение, будет возвращена ошибка. Эта ошибка будет выглядеть как TypeError: String Indices Must be Integers.

Что такое строковые индексы?

Строки — это упорядоченные последовательности символьных данных. Строковые индексы используются для доступа к отдельному символу из строки путем непосредственного использования числовых значений. Индекс строки начинается с 0, то есть первый символ строки имеет индекс 0 и так далее.

Индексы строки должны быть целыми числами

В python, когда мы видим какие-либо итерируемые объекты, они индексируются с помощью чисел. Если мы попытаемся получить доступ к итерируемому объекту с помощью строки, возвращается ошибка. Сообщение об ошибке — «TypeError: строковые индексы должны быть целыми числами».

Все символы, присутствующие в строках, имеют свой уникальный индекс. Индекс используется для указания позиции каждого символа в строке. Но все индексы должны быть целыми числами, поскольку мы не можем запомнить позицию с помощью символа, значения с плавающей запятой и так далее.

Примеры, демонстрирующие ошибку

Здесь мы обсудим все примеры, которые покажут вам ошибку в вашей программе, поскольку строковые индексы должны быть целыми числами:

Использование индексов в виде строки

В этом примере будем использовать строку в переменной line. Затем мы попытаемся получить доступ к конкретному индексу строки с помощью строкового символа в качестве индекса, а затем посмотрим результат. 

Давайте посмотрим на пример для детального понимания концепции.

line = "Тестовая строка"

string = line["е"]
print(string)

Вывод программы:

Traceback (most recent call last):
  File "D:ProjectTESTp.py", line 3, in <module>
    string = line["е"]
TypeError: string indices must be integers

Объяснение:

  • Мы использовали входную строку в переменной line
  • Затем мы взяли переменную string, в которую мы передали значение индекса в виде строкового символа.
  • Наконец, мы распечатали результат.
  • Следовательно, вы можете увидеть ошибку TypeError: String Indices Must be Integers, что означает, что вы не можете получить доступ к строковому индексу с помощью символа.

Использование индексов в виде числа с плавающей запятой

В этом примере мы возьмем входную строку. А затем попробуйте получить доступ к строке с помощью значения с плавающей запятой в качестве их индекса. Затем мы увидим результат. 

Давайте посмотрим на пример для детального понимания концепции.

line = "Тестовая строка"

string = line[1.6]
print(string)

Вывод программы:

Traceback (most recent call last):
  File "D:ProjectTESTp.py", line 3, in <module>
    string = line[1.6]
TypeError: string indices must be integers

Объяснение:

  • Во-первых, мы взяли входную строку.
  • Затем мы взяли переменную string, в которую мы передали значение индекса как число с плавающей запятой в диапазоне строки.
  • Наконец, мы распечатали результат.
  • Следовательно, вы можете увидеть «TypeError: строковые индексы должны быть целыми числами», что означает, что вы не можете получить доступ к строковому индексу с помощью числа с плавающей запятой

Решение для строковых индексов

Единственное решение для этого типа ошибки: «Строковые индексы должны быть целыми числами» — это передать значение индекса как целочисленное значение. Поскольку доступ к итерируемому объекту можно получить только с помощью целочисленного значения. Давайте посмотрим на пример для детального понимания концепции.

line = "Тестовая строка"

string = line[3]
print(string)

Вывод программы:

Объяснение:

  • Во-первых, мы взяли входную строку.
  • Затем мы взяли переменную, в которую мы передали значение индекса как целое число в диапазоне строки.
  • Наконец, мы распечатали результат.
  • Следовательно, вы можете увидеть вывод буквы «т», поскольку 3-й символ строки — «т».

Заключение

В этом руководстве мы узнали о концепции «TypeError: строковые индексы должны быть целыми числами». Мы видели, что такое строковые индексы? Также мы увидели, почему строковые индексы должны быть целыми числами. Мы объяснили этот тип ошибки с помощью всех примеров и дали код решения для ошибки. Все ошибки подробно объясняются с помощью примеров. Вы можете использовать любую из функций по вашему выбору и вашим требованиям в программе.

Однако, если у вас есть какие-либо сомнения или вопросы, дайте мне знать в разделе комментариев ниже. Я постараюсь помочь вам как можно скорее.

Ситуация: мы пишем программу, которая будет работать как словарь. Нам нужно отсортировать по алфавиту не слова, а словосочетания. Например, если у нас есть термины «Большой Каньон (США)» и «Большой Взрыв (Вселенная)». Первые слова одинаковые, значит, порядок будет зависеть от вторых слов. Получается, что сначала должен идти «Большой Взрыв», а потом «Большой Каньон», потому что «В» идёт в алфавите раньше, чем «К». 

Для этого мы пишем функцию, которая возвращает нам номер символа, стоящего сразу после пробела — whatNext(), а потом используем её, чтобы получить букву из строки:

def whatNext():
  # какой-то код, где переменная ind отвечает за номер символа
  return ind

# дальше идёт код нашей основной программы
# доходим до момента, когда нужно получить символ из строки phrase
# вызываем функцию и сохраняем то, что она вернула, в отдельную переменную
symbolIndex = whatNext()
# используем эту переменную, чтобы получить доступ к символу
symbol = phrase[symbolIndex]

Но после запуска компьютер выдаёт ошибку:

❌ TypeError: string indices must be integers

Что это значит: интерпретатор говорит нам, что обращаться к содержимому строку через индекс (порядковый номер символа в строке) можно только с помощью целых чисел. 

Когда встречается: когда вместо целого числа интерпретатор видит не его, а что-то другое — символ, другую строку, дробное число, объект или что-то ещё. Это единственная причина, по которой возникает такая ошибка.

Что делать с ошибкой TypeError: string indices must be integers

Раз мы знаем единственную причину, то решение очевидное: нужно проверить, что именно мы отправляем в качестве индекса. Судя по всему, проблема в нашей функции whatNext(), которая возвращает не целое число, а что-то иное. Сейчас мы не знаем, что именно, потому что мы не знаем, как работает whatNext().

Можно предположить, что в функции whatNext() происходили какие-то вычисления, которые возвращали не целое, а дробное число. При этом само число могло быть целым (например, 12), просто его зачем-то приводили к десятичной дроби (12,00). 

Другой вариант — функция возвращала не число, а строку с числом внутри, кортеж с одним числом, объект с числом. Для нас, людей, это всё ещё целое число, но для Python это другой тип данных. 

Чтобы это исправить, нужно зайти внутрь функции и перепроверить, что она возвращает.

Вот пара примеров, которые могут возникнуть во время работы:

Что означает ошибка TypeError: string indices must be integers

Что означает ошибка TypeError: string indices must be integers

Что означает ошибка TypeError: string indices must be integers

Но если поставить в индекс целое число — всё сработает, и мы получим символ, который стоит на этом месте в строке. На всякий случай напомним, что нумерация символов в Python идёт с нуля:

Что означает ошибка TypeError: string indices must be integers

Вёрстка:

Кирилл Климентьев

I’m playing with both learning Python and am trying to get GitHub issues into a readable form. Using the advice on How can I convert JSON to CSV?, I came up with this:

import json
import csv

f = open('issues.json')
data = json.load(f)
f.close()

f = open("issues.csv", "wb+")
csv_file = csv.writer(f)

csv_file.writerow(["gravatar_id", "position", "number", "votes", "created_at", "comments", "body", "title", "updated_at", "html_url", "user", "labels", "state"])

for item in data:
    csv_file.writerow([item["gravatar_id"], item["position"], item["number"], item["votes"], item["created_at"], item["comments"], item["body"], item["title"], item["updated_at"], item["html_url"], item["user"], item["labels"], item["state"]])

Where «issues.json» is the JSON file containing my GitHub issues. When I try to run that, I get

File "foo.py", line 14, in <module>
csv_file.writerow([item["gravatar_id"], item["position"], item["number"], item["votes"], item["created_at"], item["comments"], item["body"], item["title"], item["updated_at"], item["html_url"], item["user"], item["labels"], item["state"]])

TypeError: string indices must be integers

What am I missing here? Which are the «string indices»? I’m sure that once I get this working I’ll have more issues, but for now, I’d just love for this to work!

When I tweak the for statement to simply

for item in data:
    print item

what I get is … «issues» — so I’m doing something more basic wrong. Here’s a bit of my JSON content:

{"issues": [{"gravatar_id": "44230311a3dcd684b6c5f81bf2ec9f60", "position": 2.0, "number": 263, "votes": 0, "created_at": "2010/09/17 16:06:50 -0700", "comments": 11, "body": "Add missing paging (Older>>) links...

when I print data, it looks like it is getting munged really oddly:

{u'issues': [{u'body': u'Add missing paging (Older>>) lin...

Typeerror: string indices must be integers – How to Fix in Python

In Python, there are certain iterable objects – lists, tuples, and strings – whose items or characters can be accessed using their index numbers.

For example, to access the first character in a string, you’d do something like this:

greet = "Hello World!"

print(greet[0])
# H

To access the value of the first character in the greet string above, we used its index number: greet[0].

But there are cases where you’ll get an error that says, «TypeError: string indices must be integers» when trying to access a character in a string.

In this article, you’ll see why this error occurs and how to fix it.

There are two common reasons why the «TypeError: string indices must be integers» error might be raised.

We’ll talk about these reasons and their solutions in two different sub-sections.

How to Fix the TypeError: string indices must be integers Error in Strings in Python

As we saw in last section, to access a character in a string, you use the character’s index.

We get the «TypeError: string indices must be integers» error when we try to access a character using its string value rather the index number.

Here’s an example to help you understand:

greet = "Hello World!"

print(greet["H"])
# TypeError: string indices must be integers

As you can see in the code above, we got an error saying TypeError: string indices must be integers.

This happened because we tried to access H using its value («H») instead of its index number.

That is, greet["H"] instead of greet[0]. That’s exactly how to fix it.

The solution to this is pretty simple:

  • Never use strings to access items/characters when working with iterable objects that require you to use index numbers (integers) when accessing items/characters.

How to Fix the TypeError: string indices must be integers Error When Slicing a String in Python

When you slice a string in Python, a range of characters from the string is returned based on given parameters (start and end parameters).

Here’s an example:

greet = "Hello World!"

print(greet[0:6])
# Hello 

In the code above, we provided two parameters – 0 and 6. This returns all the characters within index 0 and index 6.

We get the «TypeError: string indices must be integers» error when we use the slice syntax incorrectly.

Here’s an example to demonstrate that:

greet = "Hello World!"

print(greet[0,6])
# TypeError: string indices must be integers

The error in the code is very easy to miss because we used integers – but we still get an error. In cases like this, the error message may appear misleading.

We’re getting this error because we used the wrong syntax. In our example, we used a comma when separating the start and end parameters: [0,6]. This is why we got an error.

To fix this, you can change the comma to a colon.

When slicing strings in Python, you’re required to separate the start and end parameters using a colon – [0:6].

Summary

In this article, we talked about the «TypeError: string indices must be integers» error in Python.

This error happens when working with Python strings for two main reasons – using a string instead of an index number (integer) when accessing a character in a string, and using the wrong syntax when slicing strings in Python.

We saw examples that raised this error in two sub-sections and learned how to fix them.

Happy coding!



Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started

Добрый день!

Передаю в скрипт массив мне его нужно отсортировать и присвоить порядковый номер. С этим мне тут помогли показали как это делается. Теперь мне нужно результат получить и «забрать». Но когда пытаюсь это сделать получаю ошибку «string indices must be integers»

Вот код:

def handle(data):
    d_json = data['custom_answer']
    d = {i: elem['full_name'] for i, elem in enumerate(d_json['groups'])}
    return d

Вот такой массив передаю в ‘custom_answer’:

{"groups":[{"full_name":"access.,infotainment,miscell.","group_name":"0","image":["https://img.levam.ru/images/oem/audi2/groups/0.png"],"link":"RXhxcFEwQVRDQ2dxSHlRNnBENHBLeFFsOEtKWThGc29QMVIvS0FESUlRT2pvVEtwOVo5WmppaE9DU3NoY01wWXd5QmtVamFwdjJjcWtrS1M2UmJ4aFpLS0g3SG14VG5xWDlydXZzSlh6UStPNWpTUE1YVVRnNG4ydFc4MG9hYiszcjdlRzZ1U0tvL0xMc1BieG02MEJ6NXRraWQ1eFRGakJHNmd1TEZpZ3d6Yy9XejkzRU8wbDJZVkh3UUpIUFpka05oSm9EbTZ0ZjRxNU4zb0ZrejBiQzZ4aSthMFJFMy8wejg2c2drVVJCUT0="},{"full_name":"body","group_name":"8","image":["https://img.levam.ru/images/oem/audi2/groups/8.png"],"link":"RXhxcFEwQVRDQ2dxSHlRNnBENHBLeFFsOEtKWThGc29QMVIvS0FESUlRT2pvVEtwOVo5WmppaE9DU3NoY01wWWpmc01scmtKVjV4c1NzbEo0OGlCV0pLS0g3SG14VG5xWDlydXZzSlh6UStPNWpTUE1YVVRnNG4ydFc4MG9hYiszcjdlRzZ1U0tvL0xMc1BieG02MEJ6NXRraWQ1eFRGakJHNmd1TEZpZ3d6Yy9XejkzRU8wbDJZVkh3UUpIUFpka05oSm9EbTZ0ZjRxNU4zb0ZrejBiQzZ4aSthMFJFMy8wejg2c2drVVJCUT0="},{"full_name":"electrics","group_name":"9","image":["https://img.levam.ru/images/oem/audi2/groups/9.png"],"link":"RXhxcFEwQVRDQ2dxSHlRNnBENHBLeFFsOEtKWThGc29QMVIvS0FESUlRT2pvVEtwOVo5WmppaE9DU3NoY01wWUFHWmRzSGRhK3hZSy9UcXJJT0pSRTVLS0g3SG14VG5xWDlydXZzSlh6UStPNWpTUE1YVVRnNG4ydFc4MG9hYiszcjdlRzZ1U0tvL0xMc1BieG02MEJ6NXRraWQ1eFRGakJHNmd1TEZpZ3d6Yy9XejkzRU8wbDJZVkh3UUpIUFpka05oSm9EbTZ0ZjRxNU4zb0ZrejBiQzZ4aSthMFJFMy8wejg2c2drVVJCUT0="},{"full_name":"engine","group_name":"1","image":["https://img.levam.ru/images/oem/audi2/groups/1.png"],"link":"RXhxcFEwQVRDQ2dxSHlRNnBENHBLeFFsOEtKWThGc29QMVIvS0FESUlRT2pvVEtwOVo5WmppaE9DU3NoY01wWVk2OERNeFJBejJNUzNBVlpISUNoSUpLS0g3SG14VG5xWDlydXZzSlh6UStPNWpTUE1YVVRnNG4ydFc4MG9hYiszcjdlRzZ1U0tvL0xMc1BieG02MEJ6NXRraWQ1eFRGakJHNmd1TEZpZ3d6Yy9XejkzRU8wbDJZVkh3UUpIUFpka05oSm9EbTZ0ZjRxNU4zb0ZrejBiQzZ4aSthMFJFMy8wejg2c2drVVJCUT0="},{"full_name":"front axle, steering","group_name":"4","image":["https://img.levam.ru/images/oem/audi2/groups/4.png"],"link":"RXhxcFEwQVRDQ2dxSHlRNnBENHBLeFFsOEtKWThGc29QMVIvS0FESUlRT2pvVEtwOVo5WmppaE9DU3NoY01wWVZtV1NKTm9KUEZDVXZFK2cyTVFnSTVLS0g3SG14VG5xWDlydXZzSlh6UStPNWpTUE1YVVRnNG4ydFc4MG9hYiszcjdlRzZ1U0tvL0xMc1BieG02MEJ6NXRraWQ1eFRGakJHNmd1TEZpZ3d6Yy9XejkzRU8wbDJZVkh3UUpIUFpka05oSm9EbTZ0ZjRxNU4zb0ZrejBiQzZ4aSthMFJFMy8wejg2c2drVVJCUT0="},{"full_name":"fuel, exhaust, cooling","group_name":"2","image":["https://img.levam.ru/images/oem/audi2/groups/2.png"],"link":"RXhxcFEwQVRDQ2dxSHlRNnBENHBLeFFsOEtKWThGc29QMVIvS0FESUlRT2pvVEtwOVo5WmppaE9DU3NoY01wWXNnWTRtS2FaWWVDOHFYbCtnUnZERVpLS0g3SG14VG5xWDlydXZzSlh6UStPNWpTUE1YVVRnNG4ydFc4MG9hYiszcjdlRzZ1U0tvL0xMc1BieG02MEJ6NXRraWQ1eFRGakJHNmd1TEZpZ3d6Yy9XejkzRU8wbDJZVkh3UUpIUFpka05oSm9EbTZ0ZjRxNU4zb0ZrejBiQzZ4aSthMFJFMy8wejg2c2drVVJCUT0="},{"full_name":"gearbox","group_name":"3","image":["https://img.levam.ru/images/oem/audi2/groups/3.png"],"link":"RXhxcFEwQVRDQ2dxSHlRNnBENHBLeFFsOEtKWThGc29QMVIvS0FESUlRT2pvVEtwOVo5WmppaE9DU3NoY01wWVdPbG9VK0lZWHZvcGRCYm55WnFZNXBLS0g3SG14VG5xWDlydXZzSlh6UStPNWpTUE1YVVRnNG4ydFc4MG9hYiszcjdlRzZ1U0tvL0xMc1BieG02MEJ6NXRraWQ1eFRGakJHNmd1TEZpZ3d6Yy9XejkzRU8wbDJZVkh3UUpIUFpka05oSm9EbTZ0ZjRxNU4zb0ZrejBiQzZ4aSthMFJFMy8wejg2c2drVVJCUT0="},{"full_name":"pedals","group_name":"7","image":["https://img.levam.ru/images/oem/audi2/groups/7.png"],"link":"RXhxcFEwQVRDQ2dxSHlRNnBENHBLeFFsOEtKWThGc29QMVIvS0FESUlRT2pvVEtwOVo5WmppaE9DU3NoY01wWUhqaXdDZmVuaGZQZmJieWFiVTN3UFpLS0g3SG14VG5xWDlydXZzSlh6UStPNWpTUE1YVVRnNG4ydFc4MG9hYiszcjdlRzZ1U0tvL0xMc1BieG02MEJ6NXRraWQ1eFRGakJHNmd1TEZpZ3d6Yy9XejkzRU8wbDJZVkh3UUpIUFpka05oSm9EbTZ0ZjRxNU4zb0ZrejBiQzZ4aSthMFJFMy8wejg2c2drVVJCUT0="},{"full_name":"rear axle","group_name":"5","image":["https://img.levam.ru/images/oem/audi2/groups/5.png"],"link":"RXhxcFEwQVRDQ2dxSHlRNnBENHBLeFFsOEtKWThGc29QMVIvS0FESUlRT2pvVEtwOVo5WmppaE9DU3NoY01wWUlMMG5NS3o5L2c4YTczbFVKOEhwRTVLS0g3SG14VG5xWDlydXZzSlh6UStPNWpTUE1YVVRnNG4ydFc4MG9hYiszcjdlRzZ1U0tvL0xMc1BieG02MEJ6NXRraWQ1eFRGakJHNmd1TEZpZ3d6Yy9XejkzRU8wbDJZVkh3UUpIUFpka05oSm9EbTZ0ZjRxNU4zb0ZrejBiQzZ4aSthMFJFMy8wejg2c2drVVJCUT0="},{"full_name":"wheels, brakes","group_name":"6","image":["https://img.levam.ru/images/oem/audi2/groups/6.png"],"link":"RXhxcFEwQVRDQ2dxSHlRNnBENHBLeFFsOEtKWThGc29QMVIvS0FESUlRT2pvVEtwOVo5WmppaE9DU3NoY01wWStQckZyUEh2bXJPZng3eXhzZlY2Q3BLS0g3SG14VG5xWDlydXZzSlh6UStPNWpTUE1YVVRnNG4ydFc4MG9hYiszcjdlRzZ1U0tvL0xMc1BieG02MEJ6NXRraWQ1eFRGakJHNmd1TEZpZ3d6Yy9XejkzRU8wbDJZVkh3UUpIUFpka05oSm9EbTZ0ZjRxNU4zb0ZrejBiQzZ4aSthMFJFMy8wejg2c2drVVJCUT0="}]

Ответ который нужно «забрать» получается примерно такой:
0. access.,infotainment,miscell.
1. body
2. electrics
3. engine
4. front axle, steering
5. fuel, exhaust, cooling
6. gearbox
7. pedals
8. rear axle
9. wheels, brakes

Понравилась статья? Поделить с друзьями:
  • Stress web 13 ошибка mysql
  • Stress cache aida64 ошибка
  • Street wars ошибка
  • Street storm ошибка памяти
  • Street power football ошибка подключения к сети