TypeError:“list indices必须是整数”循环遍历python中的元组

时间:2012-12-26 21:42:49

标签: python oracle oracle11g tuples

我是一个蟒蛇新手,所以希望这个问题很容易回答。

我从Oracle 11g中提取元组,然后想用for循环创建矩阵。但是,我收到的错误是:

TypeError: list indices must be integers, not tuple

我做错了什么?代码如下:

import cx_Oracle
con = cx_Oracle.connect('xxx')
print con.version
cur = con.cursor()
cur.execute("select zc.latitude, zc.longitude from  orders o, zip_code zc where     o.ship_date> '24-DEC-12' and TO_CHAR(zc.ZIP_CODE)=o.CONSIGNEE_POSTAL_CODE")

output = cur.fetchall()
cur.close()
con.close()

latitudes=[]
longitudes=[]

for i in output:
    latitudes[i]=output[i][0]
    longitudes[i]=output[i][1]  

我想要的最终结果是将元组分成两个数组,一个是纬度,一个是经度。

3 个答案:

答案 0 :(得分:4)

您正在循环结果行,而不是一系列数字。使用.append()将项目添加到latitudeslongitudes代替:

for i in output:
    latitudes.append(i[0])
    longitudes.append(i[1])  

for循环获取output的每个项目并将其分配给变量i,因此i是结果行元组,而不是整数。如果重命名变量可能更容易理解:

for row in output:
    latitudes.append(row[0])
    longitudes.append(row[1])  

如果结果行每行只包含2列,您还可以使用zip()技巧将列拆分为单独的列表:

latitudes, longitudes = zip(*output)

*output表示:将output中的每个元素作为单独的参数应用于zip()内置函数,因此使用zip()调用zip(output[0], output[1], output[2], ...)zip()从这些单独的行中获取每个元素,并将它们组合到新的输出列表中。每行两列意味着zip(*output)生成两个输出列表。

答案 1 :(得分:2)

你对Python for循环如何工作感到困惑 - 它循环遍历对象,而不是索引,所以你得到了元组并尝试使用它们来索引列表。

幸运的是,如果您使用the zip() builtin,那么您要做的事情实际上要容易得多,这完全符合您的要求:

latitudes, longitudes = zip(*output)

zip()可以被认为是占用数据行并返回列 - 它返回每个输入可迭代的第一项,然后是第二项,等等...... E.g:

>>> list(zip([1, 2, 3], ["a", "b", "c"]))
[(1, 'a'), (2, 'b'), (3, 'c')]

这恰好是你想要的。在这种情况下,我们使用*运算符解压缩output作为输入迭代。

答案 2 :(得分:0)

for i in output:
    latitudes[i]=output[i][0]
    longitudes[i]=output[i][1] 

应该是......

for tup in output:
    latitudes.append(tup[0])
    longitudes.append(tup[1])

因为循环遍历元组列表时得到的东西是单个元组,而不是列表中的索引。

但是,正如Lattyware所提到的,您可以简单地zip()输出。