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]  

私が望む最終結果は、タプルを2つの配列に分割することです。1つは緯度を持ち、もう1つは経度を持ちます。

4

3 に答える 3

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])  

結果の行に1行あたり2列しかない場合は、zip()トリックを使用して列を個別のリストに分割することもできます。

latitudes, longitudes = zip(*output)

*output意味:からoutputの各要素を個別の引数としてzip()組み込み関数に適用するため、。zip()で呼び出されzip(output[0], output[1], output[2], ...)ます。zip()それらの個々の行から各要素を取得し、それらを新しい出力リストに結合します。行ごとに2つの列があるということzip(*output)は、2つの出力リストを生成することを意味します。

于 2012-12-26T21:44:25.227 に答える
2

forPythonループがどのように機能するかについて混乱しています。つまり、インデックスではなくオブジェクトをループするため、タプルを取得し、それらを使用してリストにインデックスを付けようとしています。

幸いなことに、zip()ビルトインを使用すると、実際にやろうとしていることがはるかに簡単になります。これは、まさにあなたが望むことを実行します。

latitudes, longitudes = zip(*output)

zip()データの行を取得して列を返すと考えることができます-反復可能な各入力の最初の項目を返し、次に2番目の項目を返します...例:

>>> 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 に答える