«TypeError: строковые индексы должны быть целыми числами» при попытке сделать 2D-массив в Python - PullRequest
6 голосов
/ 16 июля 2011

Я так новичок в python (и в кодировании), и я просто хочу создать доску (для консольной игры) на основе желания игрока.

В основном это так ...

import array 
print("What size do you want the board?") 
Boardsize = input()
Tablero = array('b' [Boardsize, Boardsize])
for w in Boardsize:
    for h in Boardsize:
        Boardsize(w)(h).append('.')
print (Tablero)

По крайней мере, это моя идея, но компилятор говорит:

Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers

Ответы [ 3 ]

20 голосов
/ 16 июля 2011

Что происходит

input() возвращает строку (символы, которые вы ввели, например, «123»), но вы получаете TypeError, потому что вы передаете строку чему-то, что ожидает число (например, 123, без кавычек) .


Решение

Исправление заключается в преобразовании строки в число путем ее передачи через конструктор int(...), например, int(input()) (точно так же, как int("12") даст вам 12).

Я бы хотел извиниться, если вы не новичок в программировании, и это была глупая ошибка, но если вы новичок, вот мой мыслительный процесс, который помог мне отладить проблему. Я надеюсь, что вы не находите это снисходительным; Я делюсь своим мыслительным процессом, чтобы другие люди в похожих ситуациях могли исправлять подобные ошибки.


Как диагностировать подобные проблемы

Вы бы отладили это следующим образом, возвращаясь на шаг назад за один раз:

Первый тест, чтобы убедиться, что вы понимаете, как правильно сделать array s. Я, например, попытался бы создать массив размером 3х3, чтобы убедиться, что я понял API.

>>> array(..., [3,3])
<array object at 0x...>

Хорошо, это сработало! Кажется, мы можем правильно набрать array, если я просто наберу цифры array(..., [3,3]). Теперь давайте попробуем с input().

>>> boardsize = input()
>>> array(..., [boardsize, boardsize])
TypeError: string indices must be integers

Это странно. Я только что сделал массив 3х3 с array(..., [3,3]), почему array(..., [boardsize, boardsize]) не работает? Давайте проверим, каково значение boardsize на самом деле:

>>> boardsize
'3'

Как странно, значение кажется 3, верно? Позвольте мне еще раз проверить, чтобы убедиться.

>>> boardsize == 3
False

Подождите, '3'! = 3 ??? Чем «3» отличается от «3»?

>>> type(boardsize)
<class 'str'>

Ахах! ' Я понимаю, что это строка. Должно быть, input возвращает строку. Это имеет смысл, поскольку, например, я мог бы набрать «cat» и набрать boardsize == 'cat', и я не должен ожидать, что python сможет определить, является ли произвольная строка числом.

>>> '3'
'3'
>>> 3
3
>>> boardsize
'3'

Исправление будет в Google для python convert string to number: второй удар: "использовать встроенную функцию int(...)

tl; dr: двигайтесь назад к ошибке, проверяя здравомыслие на каждом шагу. Когда вы начинаете создавать большие программы, вы можете использовать автоматически называемые функции проверки работоспособности и «модульные тесты», чтобы упростить отладку.


(sidenote: если вам интересно, как распечатываются объекты, это происходит из специального метода __repr__, который определяют все классы. Вызов repr(something) покажет довольно однозначно, что за объект something; repr автоматически вызывается при выводе того, что вы вводите в интерактивный интерпретатор.)

2 голосов
/ 16 июля 2011

Позвольте мне предложить ответ, который, я думаю, поможет вам отладить.Вы сказали, что получили ошибку:

Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers

Рассмотрите содержание ошибки.Оператор индекса - это квадратные скобки сразу после переменной myvar[n], и все, что вы поместите между этими квадратными скобками n, будет считаться индексом этой переменной myvar.Вы обычно индексируете так называемые «типы последовательности» (то есть list, tuple и string) целочисленными индексами.Сообщение после вашего TypeError указывает, что ваш код пытался проиндексировать строку с чем-то отличным от целого числа.Вот пример, который вы можете попробовать в интерактивном интерпретаторе:

>>> mystr = 'cool beans, bro!' # define a string (sequence type)
>>> mystr                    # echo the value of the string by entering its name
'cool beans, bro!'

>>> mystr[0] # sequence indices start at 0, so this gives us the first character
'c' 

>>> mystr[6] # similarly, the seventh character (index 6)
'e'

>>> mystr['cool story, sis!'] # a string is not a valid index of a string
TypeError: string indices must be integers

Но где, в вашем коде, вы говорите, пытались индексировать строку?Хорошо, если заключить квадратные скобки сразу после любой переменной, Python предположит, что вы пытаетесь получить доступ к значению по какому-либо его индексу.Ваш код говорит 'b'[Boardsize, Boardsize].Если вы хотите передать как 'b', так и [Boardsize, Boardsize] в качестве параметров вашему конструктору array, вам необходимо поставить запятую между этими значениями, например:

Tablero = array('b', [Boardsize, Boardsize])

Однако я бы предостерег отвообще использовать тип array, если только у вас нет веских причин для этого.Трудно понять логику этого, особенно исходя из некоторых других парадигм программирования, но в python гораздо проще придерживаться общей структуры данных list, когда вам это удается.A list очень похож на array, но в последнем вы должны указать ему, какой размер данных вы будете предоставлять заранее, что обычно неоправданно специфично, за исключением случаев, когда требуется высокая оптимизация в отношении управления памятью.Чтобы определить список просто:

tablero = [ ]

Обратите внимание на две вещи здесь.Во-первых, как соглашение в python, большинство имен переменных должно быть lowercase или lower_with_underscores.Во-вторых, квадратные скобки не сразу после переменной в этом контексте означают нечто совершенно отличное от оператора индексации: они обозначают конструктор list, означающий, что любые значения, разделенные запятыми внутри скобок, становятся значенияминовый список.Таким образом, выражение

[Boardsize, Boardsize]

даст вам список, содержащий два значения (Boardsize и Boardsize, соответственно).Я оставлю это вам, чтобы выяснить, как использовать тип list в соответствии с вашими потребностями, попробуйте краткий учебник в официальной документации и обратите внимание, что вы можете создавать вложенные списки.

Спасибо ninjagecko за помощь в поиске полезного ответа.

0 голосов
/ 05 мая 2015

Для примера кода

Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers

Целочисленные индексы не допускаются.Чтобы заставить его работать, вы можете объявить DICT, как указано ниже:

Tablero = {}
Tablero = array('b'[Boardsize, Boardsize])
TypeError: string indices must be integers

Надеюсь, это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...