2016-04-01 17 views
1

私はMySQLでPythonを使用する方法を理解しようとしています。私は、クエリ結果のエントリを扱うのに問題があります。Index Python fetchall()

だから私はこのような何か場合:

import MySQLdb 

db = MySQLdb.connect(host="192.168.178.10", 
        user="user", 
        passwd="password", 
        db="testdb") 

cur = db.cursor() 

cur.execute("select * from Persons;") 
print(cur.fetchall()[2][2]) 


db.close() 

を私はもっともらしく思わ三行目の3番目のエントリを取得します。

私はこれを行う場合は、次の

print(cur.fetchall()[0][0:2]) 

私は最初の行のエントリに最初に取得します。どちらも妥当と思われる。

は、しかし、私はこのような何かをすれば:

print(cur.fetchall()[0:2][2]) 

が、私はエラーを取得する:

Traceback (most recent call last): 
    File "mysql.py", line 19, in <module> 
    print(cur.fetchall()[0:2][2]) 
IndexError: tuple index out of range 

私は理解していませんどの。

また、すべての行のすべての最初のエントリを(たとえば)取得できません。これを達成するには、私が望むエントリをループする必要があるようです。

誰かが私が間違ってやっていることや、どういう仕組みを明確にすることができますか?

おはようございます!なしすべての

+0

rows = cur.fetchall()[ 0:2 ] for row in rows: print (row[ 2 ]) 
)[0:2] 'ちょうどインデックス0と1を持っています –

答えて

0

まず、あなたはあなたがランダムな行を取得

cur.execute("select * from Persons;") 
print(cur.fetchall()[2][2]) 

で「三行」を取得していない注文に指定。それは十分に安定しているように見えるかもしれませんが、それを信頼しません。

あなたがIndexError: tuple index out of rangeを取得する理由は、

print(cur.fetchall()[0:2][2]) 

であなたは結果セットから0から1までの要素のスライスを取り、その後、あなたが存在しない[2]と第三要素を取るしようとしていることですあなたのスライスには2つの要素があったからです。

など。実際にあなたがmapまたはリスト内包表記、たとえば使用することができ、結果タプルから3番目の属性を取るために

In [1]: rows = tuple(zip(range(10), range(10))) 

In [2]: rows 
Out[2]: 
((0, 0), 
(1, 1), 
(2, 2), 
(3, 3), 
(4, 4), 
(5, 5), 
(6, 6), 
(7, 7), 
(8, 8), 
(9, 9)) 

In [3]: rows[0:2] 
Out[3]: ((0, 0), (1, 1)) 

In [4]: rows[0:2][0] 
Out[4]: (0, 0) 

In [5]: rows[0:2][2] 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-5-2b13f1394ba3> in <module>() 
----> 1 rows[0:2][2] 

IndexError: tuple index out of range 

:インデックスの範囲を照会するとき

In [6]: rows = tuple(zip(range(10), range(10), range(10,20))) 

In [7]: [r[2] for r in rows[0:2]] 
Out[7]: [10, 11] 
+0

ありがとう、それを明確にします。私はまだ彼らがリストに書き込むループを除いて、特定の列のすべてのエントリをアドレス指定する方法があるかどうかを知りたいですか? –

+0

リストを生成したくない場合は、必要な場合は「Personからの列を選択」を、リストを生成したくない場合は 'map'(python3)またはジェネレータ式を使用します。 –

0

にリスト要素のタプルは別のセットを返します。リストの要素のタプルの

>>> t = ([1,2,3],[4,5,6],[7,8,9],) 
>>> print(t[0:2]) # 2 is number of lists in the resulting tuple 
([1, 2, 3], [4, 5, 6]) 

ここで、結果のタプルサイズは2要素であることがわかります。また、インデックスは0と1のみにすることができます。したがって、次の文は失敗します。

>>> print(t[0:2][2]) # [2] is pointing to non existing index 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: tuple index out of range 
>>> 

これは正しい記述です。

>>> print(t[0:2][1]) 
[4, 5, 6] 

私が正しい理解していれば、あなたの意図は、フェッチされたデータセットの最初の2行から第二列の値を見つけることです。可能ステートメントであることができる:

>>> for x in t[0:2]: print (x) 
... 
[1, 2, 3] 
[4, 5, 6] 
>>> 
>>> for x in t[0:2]: print (x[2]) 
... 
3 
6 
>>> 

したがって、ステートメント

print(cur.fetchall()[0:2][2]) 

のように書き換えることができる:このスライス `cur.fetchall(bucause

関連する問題