【Python】タプルの補足(編集可否)と、コレクションの応用(ネスト)

今回は、編集ができないタプルの動作確認と、応用方法について記載していきたいと思います。

以前作成した、データベースをもとに、データを編集しようとした時にどうなるか?

また、応用としてネストについて簡単にまとめたいと思います。

目次

データベース内のデータを取り出してみる

さて、再度、以下の記事に記載されているデータを、DBから取り出してみたいと思います。

別の記事でも書かせていただいたのですが、execute関数で取得したデータは、タプルで出力することができます。

【Python】データベース(SQLite3)と接続してテーブルを操作する(cursor,execute)

2022年10月19日

データを編集してみる(エラーになる)

禄太
では、早速動作確認です!
編集できない。と言うことを確認してみたいと思います。
# coding: utf-8
import sqlite3
from unittest import result

conn = sqlite3.connect('TEST_for.sqlite3')
cur = conn.cursor()

#DBに接続して、IDが3のシャツを取得する。
for shirts in cur.execute("select * from clothes where ID == 3"):
    #シャツのコレクション種類を出力する(tuple)
    print(type(shirts))

    #該当のレコードを1レコード出力する(確認用)
    print(shirts)

    #確認用のレコード内にあるIDに対して、90を入れて更新してみる
    shirts[0] = 90

conn.close()

【実行結果】

禄太
赤枠で囲ったところに、「TypeError: ‘tuple’ object does not support item assignment」と表示されています。
これはタプルがデータの変更を許さないことを示しています。

確かに、DBからデータを取得したのに、勝手にアプリに書き換えられてしまったら、大変ですよね。

他は、print(type(shirts))のPythonコードによって、<class ‘tuple’>が出力

print(shirts)のPythonコードによって、(3, ‘Blue_shirt’, 8500)が出力されていることが確認できました。

ネスト(入れ子)構造について解説

さて、もう一つ発展的な使い方をご紹介します。

それは、ネスト(入れ子構造)です!

今まではコレクションの中に対し、文字列や数値などのデータを格納し取得してきました。

コレクションは、それだけではなく、コレクションの中にコレクションを格納することができます。

それが、ネストと言われる使い方です。

実際に動作を確認してみましょう。

# coding: utf-8
import sqlite3
from unittest import result

conn = sqlite3.connect('TEST_for.sqlite3')
cur = conn.cursor()

#DBに接続して、すべてのシャツのデータを出力する。。
cur.execute("select * from clothes")
test_r = cur.fetchall()
print(test_r)

conn.close()

【実行結果】

少しみにくいかもしれませんが、リストとタプルが1行にまとまっていて、データが二重構造で管理されていることがわかります。

補足①(Excelのような表だと思えばわかりやすい)

今回の場合、表現したいことは以下のような表と一緒です。

縦横にデータが入っていて、列に対しては入るべき値は決まっている。
※金額の列には、シャツの名前は入らない。など。

1 White_shirt 10000
2 Red_shirt 15000
3 Blue_shirt 8500
4Yellow_shirt20000
5Green_shirt5000

一体何に利用されるか?と言うと、データ分析をする場面で利用されます。
プログラムが進んでいくと、こういった多重構造のデータ管理を行う場面が出てきますので、覚えておいていただくとよいとおもいます。

禄太
コレクションを使って、こういった表管理をすることも可能です。と言うのが一点目の補足です!

補足②(ネストされたリストに対して、参照をする)

ネストされたリストをどう利用するか?をご紹介します。

ネストされたリストの行を表示する。

実際に、データを取得してみたいと思います。

添字[2]の、Blue_shirtの行を取得すコードを、実行してみます。

# coding: utf-8
import sqlite3
from unittest import result

conn = sqlite3.connect('TEST_for.sqlite3')
cur = conn.cursor()

cur.execute("select * from clothes")
test_r = cur.fetchall()

###添字[2]の行を取得する。
###Blue_shirtの行が出力される。
print(test_r[2])

conn.close()

【実行結果】

Blue_shirtの行を取得することができました!

ネストされたリストうち一つのデータ(セル)を表示する。

上記の例は、なんとなくイメージがつきやすいと思います。

では、【Blue_shirt】の文字列だけ取得したい。

Blue_shirtの【PRICE】(金額)だけ取得したい、、、など

二次元リストの中から、一つのセルの値だけを取り出すとしたら?どうしたらよいでしょうか?

答えは、添字を二つ指定することにより、セルの住所を表現することができます。

【Pythonコード】

# coding: utf-8
import sqlite3
from unittest import result

conn = sqlite3.connect('TEST_for.sqlite3')
cur = conn.cursor()

cur.execute("select * from clothes")
test_r = cur.fetchall()
print(test_r)
print(test_r[2][1])

conn.close()

【実行結果】

【イメージ】

  • Blue_shirtのIDなら:[2][0]で指定します。
  • Blue_shirtの文字列なら:[2][1]で指定します。
  • Blue_shirtの金額なら:[2][2]で指定します。
禄太
記載・実行したPythonコードは、3番目のリストの2つ目の要素を出力する。と言う内容のものでした!

他にも、white_shirtのIDなら[0][0]などで、個別のセルの値を参照することができます。

EOF

タプルの動作から、ネスト構造についてご紹介しました。

拙い説明で申し訳ないのですが、コレクションの応用編ということでシェアさせてください。

そして、私の理解が間違えていたらどなたか教えてほしい、、、です。

本日も、一緒に学習してくださって、ありがとうございました!

また、次回!

追伸:これからPythonを学ぶなら

これからPythonを学びたい!業務に活かせるように学習したい!という方ならば、まずはUdemyで学習を始めることをお勧めします。

Udemyでは、数多くの講師陣がITの知識やスキルアップのための解説動画を提供していて、現場でも役立つ知識が多数存在します。

禄太
私も、Udemyで学習しながらITのスキルを身につけ、仕事に役立てています。

特に、流行りもあるのだと思いますがPythonやAWSの講座は数が多く品質が高いものが多いです。

手前味噌ながら以下の記事で、主に初学者の方向けのお勧め講座のレビューをしていますので、ご参考にしていただけますと幸甚です。

脱初学者!!Udemy講座で徹底的に基礎を学んだので各講座のレビュー

2023年11月25日