2012-03-20 21 views
2

好吧,我是Python的新手,而这里的代码有问题的片段: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 
>>> 

究竟是什么问题,我该如何解决它?

回答

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:

按照评论s,你需要使用一个函数。好的,接下来让我们将解决方案作为一个函数来实现 - 首先,函数的输入应该作为参数接收,而不是作为当前代码中的全局变量(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]] 
+0

我更喜欢[先前版本](http://stackoverflow.com/revisions/d2a6cdb7-d17a-460b-af79-55af26b631a1/view-source)。如果'all(len(e)== 2 for e in List)',那么你应该真的使用元组而不是列表。 – phihag 2012-03-20 02:16:29

+0

@海鹰同意了,我用你的建议编辑了我的答案 – 2012-03-20 02:26:33

+0

它实现了或多或少的目标。我被告知总是在功能上做我的代码。 (当然,这是更大的代码片段的一部分) – 2012-03-20 04:22:30

1

正确的方法来索引到2维列表并不:

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

由于错误消息指出,错误路线是

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

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

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

即采取Listx个元素(这本身是一个列表),并利用该y个元素。

但是,您的迭代方法非常和谐。你从不使用item变量,但你应该。例如,写入行较短的方法是:

c = ord(item) 

通过使用maplist comprehensions,您可以将代码削减到:

def ascii(): 
    return [map(ord, l) for l in List] 
+0

它不清楚是什么版本Python使用的是Python,但值得注意的是你的map和listcomp解决方案在Py3中的行为不同 - 它会给你一个迭代器列表而不是嵌套列表。为了交叉兼容性,并且可以证明,为了剪切清晰它*是嵌套列表,嵌套列表解析可能更可取:'[[ord(m)for m in l] for l in List]''。 – lvc 2012-03-20 03:13:26

0

变更线10

c = ord(item) 
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)

希望这会有所帮助。

+0

是的,非常感谢。 – 2012-03-20 04:21:22

0

x实际上并不是一个数组。这是一个整数,你正在增加。

你需要弄清楚你想要做什么,并查找适当的语法。不清楚x [y]应该代表什么。

相关问题