1

我是python新手,所以希望这个问题可以很容易地回答。

我正在从 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]  

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

4

3 回答 3

4

您正在遍历结果行,而不是一系列数字。用于.append()添加项目,latitudeslongitudes不是:

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

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

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)产生两个输出列表。

于 2012-12-26T21:44:25.227 回答
2

您对 Pythonfor循环的工作方式感到困惑 - 它循环对象而不是索引,因此您正在获取元组并尝试使用它们来索引列表。

幸运的是,如果您使用内置功能,您尝试做的事情实际上要容易得多zip()它完全符合您的要求:

latitudes, longitudes = zip(*output)

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

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

这恰好是您想要的。在这种情况下,我们使用*操作符解包output作为输入迭代。

于 2012-12-26T21:45:05.633 回答
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()您的输出。

于 2012-12-26T21:44:56.380 回答