- PythonでMySQL…fetchall()すると[[(a,b)],…[(y,z)]]…面倒。
- fetchall()はそのまま使うものと思っていたけど抜け道もありそう。
- fetchall()[0][:] でひとつカッコが取れました。
- おまけ:タプル内の複数値を別々に「アンパック」する方法も…。
PythonでMySQL…fetchall()すると[[(a,b)],…[(y,z)]]…面倒。
そもそも、結果は取得値だけです。しかし、タプル、リストのカッコに囲まれPythonデータとして成立しています。耄碌爺にはこのカッコたちが煩わしい限りです。これを何とか簡素(≠貧相)にしたいという爺の妄想です。
mysql…fetchall()すると、リスト一次配列で値だけほしいのに、取得要素複数だとタプルになりリストになる。これがヒットした回数分作られ、最後にリストで全体が括られる…。改めて値だけ取り出すのが面倒です…老害の爺にとっては…。
このスクリプトだけでは動きません:mysql接続など略) for a_cd in cd: sql = f""" SELECT num, ac FROM m…(略) cursor.execute(sql) data = cursor.fetchall() # data:list datas.append(data) print(datas)
ループした結果が以下のような様子です。
[[('2338', '472.00')], [('2345', '387.00')], …[('9204', '582.00')]]
一番外側のリストは仕方ないとして、できるだけ簡素にしたい…とネット徘徊しました…。
fetchall()はそのまま使うものと思っていたけど抜け道もありそう。
fetchall()で取得した値が何重にもぐるぐる巻きになっているわけで、単に値が欲しいだけの爺には不便です…。そこで、ネット徘徊しました…。
- 外部サイト記事:python リストの中にあるタプルの値を取得する方法について
参照記事回答の中に「fetchall()[0][0] が 133」…というのがありました。「fetchall()」のあとに「[0][0]」とひっついているではありませんか!
他にもイロイロ徘徊したんですけど、およそ「fetchall()[0][0] 」のように使う例はヒットしませんでした。
もしかして…ということで試してみました。
fetchall()[0][:] でひとつカッコが取れました。
「fetchall()」のところを「fetchall()[0][:]」に替え、動かしたら下のようになりました。
変更前の結果:[[('2338', '472.00')], [('2345', '387.00')], …]
変更後の結果:[('2338', '472.00'), ('2345', '387.00')…]
タプルのすぐ外側のカギカッコ [ ] を削除できました。いろんなやり方があるものだと爺は感服の至りでした。
この結果、列:numをkeyにした他のリストとの結合が、pandas。DataFrame.mergeででき、爺の妄想とピッタリです。mergeを実行し希望した結果を得ることができました。
おまけ:タプル内の複数値を別々に「アンパック」する方法も…。
x = ('abc', 123) a, n = x # アンパック print(x) print(a, n) print(a) print(n)
結果は以下のようになりました
('abc', 123)
abc 123
abc
123
これをループで回せば、リスト、配列共に独立した一次配列等に直すことができそうです。ただし、爺の都合外になるのでやってないです…。