2012-12-26 61 views
1

我是一個python新手,所以希望這個問題可以很容易地得到解答。TypeError:「列表索引必須是整數」循環通過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] 

最終的結果我想是分裂的元組分成兩個陣列,一個與緯度和一個經度帶。

+0

你不是拉一個元組,你拉一個元組列表... – Ben

回答

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)產生兩個輸出列表。

+0

也許值得一提的是,如果出於某種原因,重要的是還有索引。 –

+0

@MattTenenbaum:不包含空的「緯度」和「經度」列表;由於你不能在空列表上使用索引,所以在這裏將'enumerate()'放入一個工作示例並不容易。 –

+0

真棒 - 謝謝!這很好地工作。 – Bryan

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()您的輸出。

2

您對Python for循環的工作方式感到困惑 - 它循環遍歷對象而不是索引,因此您得到元組並嘗試使用它們來索引列表。

幸運的是,你正在嘗試做的實際上是更容易,如果你使用the zip() builtin,這不正是你想要什麼:

latitudes, longitudes = zip(*output) 

zip()可以被認爲是獲取數據的行並返回列 - 這返回每個輸入可迭代的第一項,然後第二個等...例如:

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

這恰好就是你想要的。在這種情況下,我們使用*運算符來解壓output作爲輸入迭代。

相關問題