Ошибка Python: объект Int не подписан - PullRequest
2 голосов
/ 20 марта 2012

Хорошо, я новичок в python, и вот фрагмент рассматриваемого кода:

<!-- language: lang-py -->

List = [["W","w"],["A","A"],["a","a"]]

def ascii():
    x = 0
    y = 0
    aValues = [[],[],[]]
    for item in List:
        for item in List[x]:
            c = "0" 
            c = ord(List[x[y]])
            y = y + 1
            aValues[x].append(c)
        x = x + 1

    return aValues
aValues = ascii()
print (aValues)

И, когда я пытаюсь выполнить это, я получаю это сообщение об ошибке:

>>> 
Traceback (most recent call last):
  File "/Users/Hersh/Desktop/Python/ascii_conversion.py", line 16, in <module>
    aValues = ascii()
  File "/Users/Hersh/Desktop/Python/ascii_conversion.py", line 10, in ascii
    c = ord(List[x[y]])
TypeError: 'int' object is not subscriptable
>>> 

В чем именно проблема, и как я могу ее исправить?

Ответы [ 6 ]

2 голосов
/ 20 марта 2012

Как указано в сообщении об ошибке, ошибочная строка:

c = ord(List[x[y]])

x - это целое число (например, 0).Вместо этого вы хотите:

c = ord(List[x][y])

т.е. взять x -й элемент List (который сам является списком) и взять y -й элемент этого.

Тем не менее, ваш метод итерации очень непитонный.Вы никогда не используете item переменные, но вы должны.Например, более короткий способ написания этой строки:

c = ord(item)

Используя map и список пониманий , вы можете сократить свой код до:

def ascii():
   return [map(ord, l) for l in List]
1 голос
/ 20 марта 2012

Я не уверен в , что именно вы конкретно собираетесь делать с функцией, в ней несколько ошибок. Попробуйте это и скажите мне, если это то, что вы хотели:

List = [["W", "w"], ["A", "A"], ["a", "a"]]
aValues = [[ord(e1), ord(e2)] for e1, e2 in List]
print(aValues)

РЕДАКТИРОВАТЬ 1:

В качестве альтернативы, если каждый подсписок содержит более двух элементов, эта версия лучше и будет работать для общего случая:

aValues = [map(ord, pair) for pair in List]

РЕДАКТИРОВАТЬ 2:

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

def ascii(lst):
    return [[ord(element) for element in pair] for pair in lst]

Используйте это так:

List = [["W", "w"], ["A", "A"], ["a", "a"]]
ascii(List)
> [[87, 119], [65, 65], [97, 97]]
1 голос
/ 20 марта 2012

Хм.К сожалению, у вас довольно много проблем здесь.Они в основном проистекают из вашего неправильного понимания циклов в Python.

Когда вы делаете for item in List, item устанавливается для каждого элемента в списке по очереди.Таким образом, вы не можете сделать for item in List[x] на следующей строке - это не имеет смысла.item уже является внутренним списком - поэтому вы хотите сделать for inner_item in item (или назвать переменную внешнего списка чем-то более разумным).

Следующие две строки также не имеют смысла.Нет смысла устанавливать c в «0», а сразу же устанавливать его на что-то другое.И не забывайте, как я уже говорил выше, у вас уже есть элемент во внутреннем цикле, который мы назвали inner_item.Поэтому ваш код должен выглядеть так: c = ord(inner_item).

Надеюсь, это поможет.

1 голос
/ 20 марта 2012

Правильный способ индексации в двумерном списке - это не

c = ord(List[x[y]])

. Вместо этого:

c = ord(List[x][y])

Ваша ошибка связана с тем, что x [y]недопустимое подвыражение, потому что x является целым числом, а [] является оператором индекса.Вы не можете подписать целое число.

Однако вам фактически не нужно индексировать свой список, чтобы выполнить то же самое:

def ascii():
    x = 0 ## redundant
    y = 0 ## redundant
    aValues = [[],[],[]]
    for item in List:
        for item in List[x]: ## you are reusing 'item', change the name here to 'subItem'
            c = "0" ## redundant
            c = ord(List[x[y]]) ## redundant, replace with: c = ord(subItem)
            y = y + 1 ## redundant
            aValues[x].append(c)
        x = x + 1 ## redundant
0 голосов
/ 20 марта 2012

x на самом деле не массив. Это целое число, которое вы увеличиваете.

Вам нужно выяснить, что именно вы пытаетесь сделать, и найти соответствующий синтаксис для него. Не очень ясно, что x [y] должен представлять.

0 голосов
/ 20 марта 2012

Измените строку 10 на

c = ord(item)
...