我是一个蟒蛇新手,所以希望这个问题很容易回答。
我从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]
我想要的最终结果是将元组分成两个数组,一个是纬度,一个是经度。
答案 0 :(得分:4)
您正在循环结果行,而不是一系列数字。使用.append()
将项目添加到latitudes
和longitudes
代替:
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()
输出。