Python错误:Int对象不可订阅

时间:2012-03-20 01:51:26

标签: python string list integer int

好吧,我是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 个答案:

答案 0 :(得分:2)

如错误消息所示,错误的行是

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

x是一个整数(如0)。相反,你想要:

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

即。取x的{​​{1}}元素(它本身就是一个列表),然后取List个元素。

但是,您的迭代方法非常简单。你永远不会使用y变量,但你应该这样做。例如,写一行的较短方式是:

item

使用maplist comprehensions,您可以将代码缩减为:

c = ord(item)

答案 1 :(得分:1)

索引到二维列表的正确方法不是:

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

答案 2 :(得分:1)

嗯。不幸的是,你在这里遇到了很多问题。它们主要源于你对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)

希望这有帮助。

答案 3 :(得分:1)

我不确定你想要用该函数做什么,它有几个错误。试试这个并告诉我这是否是你想要的:

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]]

答案 4 :(得分:0)

将第10行更改为

c = ord(item)

答案 5 :(得分:0)

x实际上不是一个数组。这是一个你正在递增的整数。

您需要弄清楚您尝试做什么,并查找适当的语法。目前还不清楚x [y]应该代表什么。