Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿予定です。

Pythonのenumを使って2次元リストを管理する

はじめに

前回はpandasを使って表を加工する方法を書きました。VBAでは表の加工に対して、Enumは有効でしたが、Pythonの場合は表を加工するにはpandasが適していると思うので、今回は2次元リストのデータをPythonenumを使ってを管理してみたいと思います。

今回用意したデータ

青空文庫の2022年1月のXHTML版アクセスランキングのデータを使いたいと思います。

f:id:lbibouroku:20220228090310p:plain

今回は、5位までの内容を手打ちした2次元リストを用意しました。

# 青空文庫のランキング内容をリストに格納
books_list = [['〔雨ニモマケズ〕', '宮沢 賢治', 'https://www.aozora.gr.jp/index_pages/person81.html', 28940],
               ['走れメロス', '太宰 治', 'https://www.aozora.gr.jp/cards/000035/card1567.html', 24778],
               ['こころ', '夏目 漱石', 'https://www.aozora.gr.jp/cards/000148/card773.html', 22993],
               ['駈込み訴え', '太宰 治', 'https://www.aozora.gr.jp/cards/000035/card277.html', 21407],
               ['山月記', '中島 敦', 'https://www.aozora.gr.jp/cards/000119/card624.html', 19608]]

この2次元リストを使って、ランキングした本の詳細を出力するツールをenumのIntEnumクラスを使って作ります。

IntEnumクラスを活用したコード

from enum import auto, IntEnum

class Aozorabunko(enum.IntEnum):
    title = 0
    author = auto()
    url = auto()
    clicks = auto()
    
input_ranking_number = int(input('表示したいのは何位の本ですか?'))
num = input_ranking_number -1    
    
# 青空文庫のランキング内容をリストに格納
books_list = [['〔雨ニモマケズ〕', '宮沢 賢治', 'https://www.aozora.gr.jp/index_pages/person81.html', 28940],
               ['走れメロス', '太宰 治', 'https://www.aozora.gr.jp/cards/000035/card1567.html', 24778],
               ['こころ', '夏目 漱石', 'https://www.aozora.gr.jp/cards/000148/card773.html', 22993],
               ['駈込み訴え', '太宰 治', 'https://www.aozora.gr.jp/cards/000035/card277.html', 21407],
               ['山月記', '中島 敦', 'https://www.aozora.gr.jp/cards/000119/card624.html', 19608]]

title = books_list[num][Aozorabunko.title]
author = books_list[num][Aozorabunko.author]
url = books_list[num][Aozorabunko.url]
clicks = books_list[num][Aozorabunko.clicks]

print(f'2022年1月のXHTML版 アクセスランキングは{input_ranking_number}位は{author}の{title}です。クリック数は{clicks}でした!! \n詳細のurlはこちらです→{url}')

これを実行するとこんな感じになります。

たとえば「1」と入力すると・・・

f:id:lbibouroku:20220228132013p:plain

1位の「〔雨ニモマケズ〕」の情報が出力されました!

enumの解説

enumは、列挙型(定数をグルーピングして定義できる型)をサポートしています。enumには4つの列挙型のクラスがあります。

  • Enum
  • IntEnum
  • Flag
  • IntFlag

このうちのEnumクラスとIntEnumクラスについて説明します。

Enumクラスはnameとvalueというプロパティを持っています。中身を確認してみましょう。

print(Aozorabunko.clicks.name)  # 出力結果:clicks
print(Aozorabunko.clicks.value)  # 出力結果:3

今回使用したIntEnumクラスは、設定値をint型として取り扱うことができます。EnumクラスとIntEnumクラスを比較すると以下のとおりです。

from enum import Enum, auto, IntEnum

class Aozorabunko(enum.Enum):
    title = 0
    author = auto()
    url = auto()
    clicks = auto()

class IntAozorabunko(enum.IntEnum):
    title = 0
    author = auto()
    url = auto()
    clicks = auto()

print(Aozorabunko.clicks == 3)  # 出力結果:False
print(Aozorabunko.clicks.value == 3)  # 出力結果:True
print(IntAozorabunko.clicks == 3)  # 出力結果:True

このように整数を定数としてグルーピングしたいときは、IntEnumクラスを使う方が便利です。

おわりに

実はPythonenumは整数以外もグルーピングして定義することができます。

日を開けて、enumについてもう少し掘り下げてみたいと思います。

Pythonのpandasを使ってデータ加工してみる

はじめに

前回までに、VBA配列とEnumステートメントの活用についてを書きました。

VBA配列とEnumステートメントの活用1 - Kの備忘録(仮)

VBA配列とEnumステートメントの活用2 - Kの備忘録(仮)

今回は、Pythonで同じデータ加工を行う場合、どんな感じのコードになるのかを試してみます。使用するのはpandasというデータ加工に特化したライブラリです。

今回用意したデータ

前回と同じく、e-Statで公開されている2020年の国税調査結果の「人口速報集計(男女別人口及び世帯総数)」に手を加えたExcelファイルを使用します。

f:id:lbibouroku:20220219224242p:plain

ただし、書き込みは前回と異なり、新しいExcelを作成して転記します。理由は後述します。

データの詳細は上記「VBA配列とEnumステートメントの活用1」の記事のe-Statのリンクにてご確認ください。

また、今回はJupyter Notebookを使用します。

今回やりたい処理

こちらはほぼ前回の条件と同じですが、転記先は「新しいExcel ファイル」に変更します。

◆転記項目

  • 地域識別コード
  • 都道府県
  • 人口/総数
  • 人口/男
  • 人口/女
  • 人口密度
  • 世帯数

「a01」シートの「地域識別コードが「a」の項目かつ、上記7項目のみ新しいExcel ファイルを作成し「都道府県別総人口」シートへ転記する

pandasライブラリを使用したコード

import pandas as pd

path = 'Enum検証国税調査2020年pandas01.xlsx'
df = pd.read_excel(path, sheet_name='a01')

df2 = df[df['地域識別コード'] == 'a']
df2 = df2[['地域識別コード', '都道府県', '人口/_総数', '人口/男', '人口/女', '人口密度', '世帯数']]

path2 = 'Enum検証国税調査2020年pandas02.xlsx'
df2.to_excel(path2, sheet_name='都道府県別総人口', index=False, )

コード短い・・・!特別なメソッドなどを使わなくても簡単にデータ抽出して転記できてしまいました。

「どの項目が転記対象か」ということも一目でわかりますね。全体的にコメント書かなくても可読性に問題ないと思います。

解説

Jupyter Notebookでセルを分けて、データの状況を確認していきます。

import pandas as pd

path = 'Enum検証国税調査2020年pandas01.xlsx'
df = pd.read_excel(path, sheet_name='a01')
df.columns

ここでセルを区切って実行すると、以下のように項目(columns)が確認できます。

Index(['地域識別コード', '都道府県', '地域名', '人口/_総数', '人口/男', '人口/女',
       '2015年(平成27年)の人口(組替)', '5年間の人口増減数', '5年間の人口増減率', '人口性比', '面積(参考)',
       '人口密度', '世帯数', '2015年(平成27年)の世帯数(組替)', '5年間の世帯増減数', '5年間の世帯増減率'],
      dtype='object')

転記元データの項目名が問題なく取得できていますね。

次のセルを実行します。

df2 = df[df['地域識別コード'] == 'a']
df2 = df2[['地域識別コード', '都道府県', '人口/_総数', '人口/男', '人口/女', '人口密度', '世帯数']]
df2 

転記用に「df2」というデータフレームを用意して、対象のレコード(この場合「地域識別コードが「a」の項目)を抽出し、さらに対象の7つのcolumnsを指定しています。

df2の内容は以下のとおりです。

f:id:lbibouroku:20220220193001p:plain

↓の前回のVBAの検証のときと同じ内容ですね!(一番左は「dfのindex」なので、気にしなくて大丈夫です)

f:id:lbibouroku:20220219223657p:plain

次のセルを実行します。

path2 = 'Enum検証国税調査2020年pandas02.xlsx'
df2.to_excel(path2, sheet_name='都道府県別総人口', index=False, )

出力したExcel ファイルを確認すると、正しくデータは転記できているのですが、1行目の太字と罫線が気になります・・・。データフレームをExcelファイルに書き込むとこうなってしまうので仕方ないです・

f:id:lbibouroku:20220220192050p:plain

また、pandasのto_excelメソッドでExcel ファイルを書き出すと指定したシート以外消えるという恐ろしい仕様があるので注意です!!!

おそらく他のライブラリを使えばPythonでもちゃんと転記できると思うのですが、今回はデータ加工の部分に重きを置いたため、転記元と同じExcelファイルへの書き出しの諦めました。

pandasについて思ったこと

pandasは少しだけ使ったことがあるのですが、今回のことも含め簡単まとめると以下の3点です。

  • Pythonで表形式のデータ加工するなら、最強のライブラリなのでは?
  • csvファイルの読み書きなら、エンコードに気をつければ問題なさそう
  • Excelファイルの書き出しにクセがある

おわりに

「pandasすごいですね」って改めて思いました。それ以上の言葉が出ない・・・。

次回はとうとうPythonのリストとenumクラスの検証を行います!これがやりたかったので楽しみです!

VBA配列とEnumステートメントの活用2

はじめに

前回「VBA配列とEnumステートメントの活用」について、コードを書く準備段階の記事を書きました。(本当は1記事の予定が、長くなってしまったので2つに分けました。)

lbibouroku.hatenablog.com

今回は続きで、実際のコードを紹介します!

◆目次◆

Enumステートメントを活用したコード

さっそく前回まとめた条件でコードを書いてみましょう。

Option Explicit

Enum a01シート項目
    地域識別コード = 1
    都道府県
    地域名
    人口_総数
    人口_男
    人口_女
    人口_2015年
    過去5年間の人口増減数
    過去5年間の人口増減率
    人口性比
    面積_参考
    人口密度
    世帯数
    世帯数_2015年
    過去5年間の世帯増減数
    過去5年間の世帯増減率
End Enum
    
Sub 都道府県別総人口情報抽出()

  'ブックと各シートを定義する
    Dim wb As Workbook
    Set wb = ThisWorkbook
    
    Dim ws_a01 As Worksheet
    Set ws_a01 = wb.Worksheets("a01")
    
    Dim ws_都道府県別総人口 As Worksheet
    Set ws_都道府県別総人口 = wb.Worksheets("都道府県別総人口")
    
  '「a01」シートの内容を格納する配列arr1と「都道府県別総人口」シートに転記する配列arr2を定義する
    Dim arr1 As Variant
    arr1 = ws_a01.Cells(1, 1).CurrentRegion.Value
    
    Dim arr2() As Variant
    
  '配列arr1をカウントする変数iと配列arr2を作成するためのカウント変数numを定義する
    Dim i As Long
    Dim num As Long: num = 1
    
  '配列arr2に、配列arr1から条件に一致した値を格納する
  ’今回はarr1の項目名も配列arr2へ格納する
    For i = 1 To UBound(arr1, 1)
        If arr1(i, a01シート項目.地域識別コード) = "a" Or _
            arr1(i, a01シート項目.地域識別コード) = "地域識別コード" Then
            
            ReDim Preserve arr2(1 To 7, 1 To num)
            arr2(1, num) = arr1(i, a01シート項目.地域識別コード)
            arr2(2, num) = arr1(i, a01シート項目.都道府県)
            arr2(3, num) = arr1(i, a01シート項目.人口_総数)
            arr2(4, num) = arr1(i, a01シート項目.人口_男)
            arr2(5, num) = arr1(i, a01シート項目.人口_女)
            arr2(6, num) = arr1(i, a01シート項目.人口密度)
            arr2(7, num) = arr1(i, a01シート項目.世帯数)
            num = num + 1
            
        End If
    Next i
    
  '配列arr2の1次元目と2次元を入れかえる
    arr2 = WorksheetFunction.Transpose(arr2)

  '配列arr2を「都道府県別総人口」シートに転記する
    With ws_都道府県別総人口
        .Range(.Cells(1, 1), .Cells(UBound(arr2, 1), UBound(arr2, 2))).Value = arr2
    End With
    
End Sub

マクロ実行後の結果を見てみましょう。項目名なども一緒に転記できています。 f:id:lbibouroku:20220219223657p:plain

最後の行は「47_沖縄県」です。すべてきちんと転記できていますね! f:id:lbibouroku:20220219223758p:plain

解説

Enumステートメントを活用してる部分を抜粋して説明します。

といっても、見た目どおりですね。

例えば arr2の1次元目が1のときは「a01」シートの「地域識別コード」の列の値を格納しています。

Enumステートメントで「a01」シートのそれぞれ項目名が何列目にあるのかを定義しているから、どの項目が何列目にあるかを覚えておく必要がありません。

    For i = 1 To UBound(arr1, 1)
        If arr1(i, a01シート項目.地域識別コード) = "a" Or _
            arr1(i, a01シート項目.地域識別コード) = "地域識別コード" Then
            
            ReDim Preserve arr2(1 To 7, 1 To num)
            arr2(1, num) = arr1(i, a01シート項目.地域識別コード)
            arr2(2, num) = arr1(i, a01シート項目.都道府県)
            arr2(3, num) = arr1(i, a01シート項目.人口_総数)
            arr2(4, num) = arr1(i, a01シート項目.人口_男)
            arr2(5, num) = arr1(i, a01シート項目.人口_女)
            arr2(6, num) = arr1(i, a01シート項目.人口密度)
            arr2(7, num) = arr1(i, a01シート項目.世帯数)
            num = num + 1
            
        End If
    Next i

試しに、上記の部分をEnumを使用せずに書くとこうなります。

    For i = 1 To UBound(arr1, 1)
        If arr1(i, a01シート項目.地域識別コード) = "a" Or _
            arr1(i, a01シート項目.地域識別コード) = "地域識別コード" Then
            
            ReDim Preserve arr2(1 To 7, 1 To num)
            arr2(1, num) = arr1(i, 1)
            arr2(2, num) = arr1(i, 2)
            arr2(3, num) = arr1(i, 4)
            arr2(4, num) = arr1(i, 5)
            arr2(5, num) = arr1(i, 6)
            arr2(6, num) = arr1(i, 12)
            arr2(7, num) = arr1(i, 13)
            num = num + 1
            
        End If
    Next i

パッと見て配列arr2にどんなの項目の値を格納しているのかわかりません。コメントを付けて項目名を明示することは可能ですが。

たとえば、さらに「別の条件で情報抽出して別のシートへ転記する」という操作が複数ある場合、いちいちコメントを付けるのも面倒なうえ手作業が増えるとミスも発生しやすくなります。

以上のことから「VBAの配列とEnumステートメントの相性が良いことが証明できたのでは?」個人的には思っています。

おわりに

実は、今回VBAの配列とEnumステートメントの活用を紹介して有用性を示したのは、「Pythonのリストとenumクラスの活用は有用なのか?」を検証するためです。

なぜならPythonにはpandasという便利なライブラリがあります!

なので、次回は今回と同じ処理を「Pythonでpandasライブラリを使用したらどんなコードになるのか」を検証したいと思います。

VBA配列とEnumステートメントの活用1

はじめに

私はEnumステートメントが大好きです!なぜならコードの可読性が上がるので便利だからです。

Enumステートメントを使うと定数をまとめて定義できます。これが配列と相性がいいので、よく一緒に使います。

今回はその一例を紹介します。

今回用意したデータ

e-Statで公開されている2020年の国税調査結果の「人口速報集計(男女別人口及び世帯総数)」を使用します。

https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200521&tstat=000001136464&cycle=0&tclass1=000001136465&tclass2=000001154388&tclass3val=0

ダウンロードしたファイルを確認します。 f:id:lbibouroku:20220219224129p:plain

このままでは、ちょっとVBAの配列が使いにくいですね・・・。なので手を加えて以下のように加工しました。 f:id:lbibouroku:20220219224242p:plain

ちなみに、このブックのシートは、もともとあった「a01」と、今回転記用に使用する「都道府県別総人口」を追加した2シートです。 f:id:lbibouroku:20220219230909p:plain

今回やりたい処理

では、このデータを使用してEnumステートメントと配列を活用して実施する内容を決めます。

まずはざっくり、こんな感じで決めてみました。

「a01」シートから全国と各都道府県の総人口情報を収集して、必要な項目のみ「都道府県別総人口」シートへ転記する

このままでは抽象的なので、具体的に条件を決めていきます。

地域識別コードを調べてみると、総数の情報は「地域識別コード:a」のようですね。よって「地域識別コードが「a」の項目を転記対象とする」という条件ができました。

また、転記する項目は以下7項目としましょう。

  • 地域識別コード
  • 都道府県
  • 人口/総数
  • 人口/男
  • 人口/女
  • 人口密度
  • 世帯数

まとめると以下の処理になります。

「a01」シートの「地域識別コードが「a」の項目かつ、上記7項目のみ「都道府県別総人口」シートへ転記する

さて、やりたいことが決まったところで、 Enumステートメントの定義内容を決めます。

Enumステートメントの定義内容

まずはEnumステートメントで定義したいグループ名を決めます。

今回は「「a01」シート1行目の項目名」を対象にします。

よって、Enumステートメントのグループ名は「a01シート項目」とします。

では、グループの各要素名を決めましょう。

「a01」シート1行目の項目名は以下の16個です。

  • 地域識別コード
  • 都道府県
  • 地域名
  • 人口/総数
  • 人口/男
  • 人口/女
  • 2015年(平成27年)の人口(組替)
  • 5年間の人口増減数
  • 5年間の人口増減率
  • 人口性比
  • 面積(参考)
  • 人口密度
  • 世帯数
  • 2015年(平成27年)の世帯数(組替)
  • 5年間の世帯増減数
  • 5年間の世帯増減率

さて、ここで注意点があります。

VBAでは変数名や、Enumステートメントのグループ名や要素名などには、命名ルールがあります。

Office TANAKAさんのサイトからVBAの変数の命名の注意点を引用します。 http://officetanaka.net/excel/vba/variable/06.htm

  1. 変数名には文字(日本語を含む)のほか、アンダーバー(_)だけを使えて、そのほかの記号やスペースは使えない
  2. 変数名の先頭が数字やアンダーバー(_)ではいけない
  3. 同じ適用範囲で同じ名前は使えない
  4. 変数名の長さは半角で255文字まで

Enumステートメントのグループ要素も同じ命名ルールです。よって、少し工夫して今回は以下のEnumステートメントのグループの要素名で定義します。

  • 地域識別コード
  • 都道府県
  • 地域名
  • 人口_総数
  • 人口_男
  • 人口_女
  • 人口_2015年
  • 過去5年間の人口増減数
  • 過去5年間の人口増減率
  • 人口性比
  • 面積_参考
  • 人口密度
  • 世帯数
  • 世帯数_2015年
  • 過去5年間の世帯増減数
  • 過去5年間の世帯増減率

Enumステートメントの定義内容が決まったところでコードを書きたいのですが、長くなってしまったので一旦ここで区切ります。

2022年の目標-学習編-

はじめに

みなさま、あけましておめでとうございます。今年もよろしくお願いします!

さて、昨年末に2022年の抱負を建てました。 内容はこんな感じです。

  • Pythonの世界を広げる
  • 料理を作るモチベーションを上げて健康的な食生活を送る
  • ライブにいっぱい行く

1年を通してゆるっと達成できれば位に思って決めた抱負ですが、学習面についてもう少し具体的に計画を立てたいなって思ったので、まとめてみます。

◆目次◆

技術ライティング

去年のうちに技術書典へ向けての執筆も終ったので、今年はノウハウの蓄積と技術ブログの執筆に力入れたいなって思います。

ノウハウ蓄積はNotionを使う予定です。なので、自分が見やすいようなNotionの設計を現在考え中です。この辺の設計は苦手です・・・。

でもここで詰まってたら他の学習も進まないので、とりあえず走り出すのでいいかなと思ってます(後から変えられるし)。

やることリスト

  • 技術ライティングについて復習する
  • Notionでノウハウの蓄積・管理をする
  • 蓄積したノウハウをきれいに整えて技術ブログで公開する

Python

今年一番力を入れたいところです!

ちゃんとリーダブルなコード書けるようになりたいし、他のサービス(主にGoogle関連)と連携もできるようになりたい。

あと、個人的に分析とか機械学習も勉強したいです。

やることリスト

20本ノック→「Python実践データ分析100本ノック」のうち、最初の20本をたまにリファクタリングしてみて、自分の成長を計りたいなって思ってます。

データ分析系

仕事でデータを扱うので、データサイエンスや統計の分野も勉強したいです。

結構読みたい本は決まっているので、読んで自分なりに要約したり、ExcelPythonで実践したりして理解していきたいな。あと、この辺の分野についていろんな人と話をしたいです。

やることリスト

Google Workspace

これも仕事で使います。スプレッドシート関数は少し調べたけどExcel関数と同じものも多数ある印象。

ここは楽しみながらできそう!

やることリスト

おわりに

あれ、やることいっぱいある・・・。できるのか?

まずは、3か月くらい強化月間としてがんばります。時々、振り返りブログで状況を記録したいですね。

2021年振り返り

はじめに

2021年も残すところ2週間、早いものですね。

今年は割とやり残したことはないように思います。なんかいろいろあったなあ・・・。手帳と私の記憶を頼りにしつつ、ノンプロ研の活動を中心にちょっと振り返ってみます。

本記事は私の所属しているコミュニティ、ノンプログラマーのためのスキルアップ研究会の『ノンプロ研 Advent Calendar 2021』 17日目の記事です。

adventar.org

ノンプロ研入会

VBAを独学してましたが、2020年から壁にぶつかってました。周りに相談できる人もいなかったので、モチベーションも下がってきてだいぶ煮詰まってましたね。

一人で悩んでも解決しないなと、思い切って2021年2月にノンプロ研に入会しました。

入会前はVBAの入口当たりが私の知っているプログラミングの世界でしたが、入会後は、PythonVBAの知らなかった部分やプログラミング以外のことも知る機会を経て世界が広がった感じです!

このコミュニティを見つけた私は運がいいですw

VBA

ノンプロ研入会前もある程度想定した動きをするマクロは作れていました。しかし動きが複雑なものになると保守性が低く、動きもフリーズしそうなマクロになってしまいどうしたらいいのか悩んでいました。

VBA中級講座を受講し、今まで書けなかったコードが書けるようになりました!リファクタリングもできたし、おそらく大きな壁を一つ乗り越えられたので、満足です。

オブジェクトブラウザとオブジェクトモジュールが使えるようになったのも、この講座のおかげです。

Python

これも前に独学で即挫折していました。あと、何に使うのかもよくわかっていなかったです。

Python初級講座を受講し簡単なツールが作れるようになりました。講座のティーチングアシスタントをさせていただくことにもなって・・・人生何があるかわかりませんね。

これからはデータ分析とか機械学習の方向を学んでいきたいなと思っています。

技術ライティング

技術ライティング講座を受講し、技術ブログが書けるようになりました。あと、Twitterも活用できるようになったのかな。Git&githubもちょっと使えるようになりました!

仕事でも、文章の書き方をより考えるようになったので、ノンプロ研の中では一番コスパがいい講座だと思います(課題はしんどいけど)。

そして、技術書典に技術本を出典することになりました・・・。

Excel VBA配列入門

これは、技術書典に出す本のタイトルです。

正直、企画書提出時はそんなに配列のことわかってなかったし嫌いでした。なので、同じようにVBA配列の学習に苦労している人もいると思うので「需要はあるかも」と思ってこの題材にしました。そろそろ、VBA配列についてまとめた本が出来そうです(12/16現在、終わりは見えてきました)。

たぶん、4か月くらい配列のことを考え続けてきましたが、ようやくそんな日々も終わりそうです!

監修のタカハシさんをはじめ、アドバイスをくれた方々、応援してくれた方々のおかげで1冊の本の形になったので、みなさんには感謝しかないです。ありがとうございました!

ノンプロ研以外

いろいろありましたが、ここに書ける範囲だとカンピロバクターに感染したのが今年の事件でした。 ほんとに辛くて、3日間寝込みました。あれから鶏肉は良く焼くようになりましたw

総括

総じて楽しい1年でした。やはりノンプロ研入会は大きな転機だったと思います。

手帳を見たら今年は仕事の面では辛いことが結構あったようですが、7割くらい忘れていたので我ながら得な性分だなと思います。

結果、今が一番楽しいし、未来は明るいです。

来年の抱負

せっかくなので、来年の抱負を3つあげます。

  • Pythonの世界を広げる
  • 料理を作るモチベーションを上げて健康的な食生活を送る
  • ライブにいっぱい行く

さいごに

なんだか日記のような内容になってしまいましたが、ここまで読んでいただいてありがとうございます。みなさん良いお年をお迎えください。

それでは、みやさんにAdvent Calendarのバトンを渡します!

みやさん、よろしくお願いします('ω')ノ

Pythonのリストの加算と乗算の検証

はじめに

Pythonのリストでは、リスト同士の加算または乗算で要素の追加が可能です。

では、加算または乗算するとどうなるのか、検証したいと思います。

なお、Pythonではリスト同士の減算と除算はPythonではサポートしていません。試したところ、以下のエラーが出ました。

TypeError: unsupported operand type(s) for -: 'list' and 'list'

直訳: -: 'list'および 'list'のサポートされていないオペランドタイプ

ますは、リストの基本をおさらいします。

リストとは

データの集合で、変更可能かつ、順序がある反復可能なデータ型です。

リストの生成

リストを生成するには、以下のとおり変数に値を代入します。

変数 = [要素1, 要素2, 要素3, ・・・]

例)

list_a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(list_a)

出力結果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

では、基本をおさらいしたところで、さっそく検証してみましょう。

1次元リストの検証

1次元リスト同士でリストを加算

list_a = [1, 2]
list_b = [3, 4]

print(list_a + list_b)

出力結果:[1, 2, 3, 4]

単純に要素が追加されて、2つの1次元リストが1つになりました。

では、累算代入演算子を使って加算するとどうなるでしょうか。

list_a = [1, 2]
list_b = [3, 4]

list_a += list_b

print(list_a)

出力結果:[1, 2, 3, 4]

変数list_aに変数list_bの要素が追加されました。

1次元リストを乗算

list_a = [1, 2]*2

print(list_a)

出力結果:[1, 2, 1, 2]

変数list_aの要素が繰り返され、要素数が2倍になりました。

1次元リストの検証結果

加算または乗算することで、1次元リストの要素数が増えます。

2次元リストの検証

2次元リスト同士でリストを加算

list_a = [[1, 2]]
list_b = [[3, 4]]

print(list_a + list_b)

出力結果:[[1, 2], [3, 4]]

単純に要素が追加されて、2つの2次元リストが1つになりました。

では、累算代入演算子を使って加算するとどうなるでしょうか。

list_a = [[1, 2]]
list_b = [[3, 4]]

list_a += list_b

print(list_a)

出力結果:[[1, 2], [3, 4]]

こちらも単純に、変数list_aに変数list_bの要素が追加されました。

2次元リストを乗算

list_a = [[1, 2]]*2

print(list_a)

出力結果:[[1, 2], [1, 2]]

2次元リストのまま変数list_aの要素が繰り返され、要素数が2倍になりました。

2次元リストの検証結果

加算または乗算することで、2次元リストの要素数が2次元リストのまま増えます。

1次元リストと2次元リストの組み合わせの場合を検証

1次元リストと2次元リストを加算

list_a = [[1, 2]]
list_b = [3, 4]

print(list_a + list_b)

出力結果:[[1, 2], 3, 4]

リストは1つにまとまったものの、変数list_aの部分は2次元リスト、list_bの部分は1次元リストという結果になりました。

では、累算代入演算子を使って加算するとどうなるでしょうか。

list_a = [[1, 2]]
list_b = [3, 4]

list_a += list_b

print(list_a)

出力結果:[[1, 2], 3, 4]

元の変数list_aの部分は2次元リストで、追加されたlist_bの部分は1次元リストのままという結果になりました。

1次元リストと2次元リストの組み合わせの場合の検証結果

加算または乗算することで、リストを1つにすることはできますが、2次元リストの部分は2次元リストのまま、1次元リストの部分は1次元リストのまま要素数が増えます。

おわりに

検証結果は、おおよそ想定どおりでした。

ただ、リストの加算または乗算のパターンを知ることで、リストの操作がしやすくなるので、検証する価値はありました。

ほかのデータの集合でも検証すると面白いかもしれませんね!