カテゴリー

Python基礎

【python&list】pythonのlistの超基礎

2021年5月15日

こんな人にオススメ

pythonlistってなんなの?

どういうことが出来てどういう時に便利なの?

ということで、今回はpythonにおけるlistの超基礎について解説する。listのような書き方はよく使うと思われるので是非とも本記事で基礎を知ってもらえればと思う。

以前公開した、pythonを独学で学ぶために知っておきたいマインドについては以下参照。

【python&独学】独学である程度pythonを習得するマインド

続きを見る

python環境は以下。

  • Python 3.9.2

運営者のメガネです。YouTubeTwitterInstagramも運営中。自己紹介お問い合わせページあります。

運営者メガネ

listとは

pythonにおけるlistとは、pythonに標準搭載されている、複数の要素を一括で管理できる箱(配列)のようなものだ。中身は変更可能で、追加や削除などが行える。

listのイメージ

listのイメージは以下のような感じ。[]の中に要素として数値や文字列を入れることで使用することができる。

lst = [1, True, 'aaa']
print(lst)
# [1, True, 'aaa']

listの活用方法

listっていつ、どういう場面で使用するのかだが、例えば複数回同じテストが行われる状況を考えていただきたい。

この時、ノー勉でテストした時の点数が30点、1回勉強した時の点数が60点、2回目の勉強の時の点数が70点、3回目の点数が80点、4回目の点数が90点だったとしよう。

これらの点数を変数を使用して表すと例えば以下のようになる。

test0 = 30
test1 = 60
test2 = 70
test3 = 80
test4 = 90

今回はテストの回数が4回だけだったから上記のようにtest4のように連番を振ったっが、これがtest100test1000のように数が増えるとこの方法だと書く量が半端ではなくなる。

上記のことをlistを使用して書くと以下のように書ける。

test = [30, 60, 70, 80, 90]

かなりスッキリした。ただ、この場合だとどの要素(ここでいう点数)が何回目かがわかりにくい。その場合は辞書型(dict)を使用する方がいい。

本記事では扱わないが、一応dictを使用した場合での書き方を以下に示す。

test_dct = {'0': 30, '1': 60, '2': 70, '3': 80, '4': 90}

dictにすると何回目かがわかりやすい。ただし、dictは後ほど説明するlistとは操作の方法が異なるので別途勉強が必要。

listの作り方

ここからは実際にlistの作成方法について解説していく。最初は深く考えずにとにかく書いて動かしていくのがいいだろう。

[]で作る

まずは先ほども出てきた[]を使用して作成する方法。

test = [30, 60, 70, 80, 90]

要素を取り出したい時は(list名)[(取り出したい要素のインデックス)]の形式で行う。「インデックス」とは何番目にあるかの番号のこと。

ここで気をつけないといけないのが、先頭のインデックスは0であるということ。1にすると一つ後の要素が選ばれるので注意。

test = [30, 60, 70, 80, 90]
print(test[0])
# 30
print(test[1])
# 60
print(test[2])
# 70
print(test[3])
# 80
print(test[4])
# 90

list()で作る

次の作り方はlist()を使用するというもの。[]と何が違うのかはややこしくなるので割愛。初めは好きな方を選んで、エラーとか変な挙動を示したら勉強すればいいと思う。

具体的な作り方は以下。

test = list((30, 60, 70, 80, 90))
test = list([30, 60, 70, 80, 90])

list(の後に[とするか(とするかの違いだがどちらでもいい。今回も要素を取り出してみる。

print(test[0])
# 30
print(test[1])
# 60
print(test[2])
# 70
print(test[3])
# 80
print(test[4])
# 90

結果はもちろん同じ。

rangeで作る

また違った書き方としてrangeを使う方法がある。rangeは一定の法則に従った連番を作成するというもので、そのrangelistに変換する。

ただ、連番を作成するというものなので、今回のtest030を表現するのは難しい。以下の例ではtest160から作成している。

serial = list(range(60, 100, 10))
print(serial)
# [60, 70, 80, 90]
print(serial[0])
# 60
print(serial[2])
# 80

range(60, 100, 10)60から100までを10刻みで、ということだがpythonの場合は100は数えない。意味合いとしては<100のイメージ。10刻みなので<100の条件に合う最後の数値は90となる。

[~]*(数字)で繰り返し作成

同じ要素の繰り返しを作成したい場合は、繰り返したい要素に繰り返したい回数をかければいい。

lst = [30, 40, 50] * 3
print(lst)
# [30, 40, 50, 30, 40, 50, 30, 40, 50]

listに要素を追加

listの作成方法は述べた。では、既存のlistに要素を追加したい場合はどうすればいいのか。ここでは要素の追加について解説する。

.appendで後ろに追加

まずは.appendを使用する方法。.appendを使用するとlistの最後尾に要素を追加することができる。以下では最後尾に100を追加した。

test = [30, 60, 70, 80, 90]
test.append(100)
print(test)
# [30, 60, 70, 80, 90, 100]

ただし、追加する要素は1つのみで、2つ以上追加しようとするとエラーとなる。

test = [30, 60, 70, 80, 90]
test.append(95, 100)
#     test.append(95, 100)
# TypeError: list.append() takes exactly one argument (2 given)

2つ以上がダメなら1つにすればいいのではということで[95, 100]とすると、エラーは出ないがその代わりにネスト(入れ子)状態になってしまう。

test = [30, 60, 70, 80, 90]
test.append([95, 100])
print(test)
# [30, 60, 70, 80, 90, [95, 100]]

なお、.appendは要素を追加するだけなので、戻り値(結果こうなりました的なもの)がなく、printしてもNoneが返される。

test = [30, 60, 70, 80, 90]
print(test.append(100))
# None

[~]+[...]で追加

では複数個の要素を同時にくっつけたい時はどうすればいいのか。それはlist同士を足し算すれば解決する。例えば以下の例だと、95点と100点を1つのlistに置いてから足し算している。

test = [30, 60, 70, 80, 90]
add = [95, 100]
test_new = test + add
print(test_new)
# [30, 60, 70, 80, 90, 95, 100]

この場合もどんどん後ろに追加される。addの要素が1つの時も3つ以上も同様に追加可能。

.insertで任意の場所に追加

.insertを使用することで、任意の位置に要素を追加することができる。書き方は以下。

.insert((要素を追加したいインデックス), (追加したい要素))

以下ではインデックスとして1を選択し(3060の間)、追加したい要素は45とした。

test = [30, 60, 70, 80, 90]
test.insert(1, 45)
print(test)
# [30, 45, 60, 70, 80, 90]

インデックスは30の左が0番目で、3060の間が1番目で...というように割り振られている。したがって、この場合だとインデックスに5を指定することで最後尾に要素を追加することができる。

test = [30, 60, 70, 80, 90]
test.insert(5, 100)
print(test)
# [30, 60, 70, 80, 90, 100]

この場合もappendと同じように同時に複数個の要素を挿入することはできない。

test = [30, 60, 70, 80, 90]
test.insert(1, 45, 55)
#     test.insert(1, 45, 55)
# TypeError: insert expected 2 arguments, got 3

listにして挿入すればエラーを回避できるが、appendの時と同様、ネストされた状態になる。

test = [30, 60, 70, 80, 90]
test.insert(1, [45, 55])
print(test)
# [30, [45, 55], 60, 70, 80, 90]

なお、.insert.appendと同じように、printしてもNoneが返されれるだけ。

test = [30, 60, 70, 80, 90]
print(test.insert(1, 45))
# None

listから要素を削除

要素の追加を知ったところで、次は要素を削除する方法について解説する。要素の削除の仕方はたくさんあるが、ここでは簡単なものだけに絞って解説する。

delで削除

まずはdelを用いた要素の削除方法。シンプルにdelだけすると、要素だけではなく変数そのものが削除される。すなわち定義されていないことになる。

test = [30, 60, 70, 80, 90]
del test
print(test)
#     print(test)
# NameError: name 'test' is not defined

だから、delで削除する際にはどの要素を削除するのかを指定する必要がある。以下では1番目の60を削除している。

test = [30, 60, 70, 80, 90]
del test[1]
print(test)
# [30, 70, 80, 90]

法則にしたがって要素を削除したい場合は、:を使ってスライスで削除する。イメージはrangeの時と同じ。以下では1番目の30から3番目の80までを削除した(1:44<4の意味)。

test = [30, 60, 70, 80, 90]
del test[1:4]
print(test)
# [30, 90]

listの定義は削除せずに全要素を削除したい場合は、スライスを[:]とする。

test = [30, 60, 70, 80, 90]
del test[:]
print(test)
# []

スライスで削除

delに似ている方法として単にスライスを使用する方法がある。使い方はシンプルで、削除したい要素を空のlist[]に置き換えるだけ。

例えば、以下の例だとスライスを[1:2]にすることでインデックスが1以上2未満の要素を消している。

test = [30, 60, 70, 80, 90]
test[1:2] = []
print(test)
# [30, 70, 80, 90]

もちろん複数要素を一括で削除することも可能。

test = [30, 60, 70, 80, 90]
test[1:4] = []
print(test)
# [30, 90]

あるインデックス以降の要素を全て削除したい場合は[1:]のようにすればいい。以前の場合は例えば[:4]のようにする。スライス寄りの話だったのでスライスでの削除の項目で紹介したが、もちろんdelでも使用できる。

test = [30, 60, 70, 80, 90]
test[1:] = []
print(test)
# [30]

単に数値だけ指定した場合は、要素が空のlistに置き換わる。

test = [30, 60, 70, 80, 90]
test[1] = []
print(test)
# [30, [], 70, 80, 90]

全要素を削除したい時は[:]とする。

test = [30, 60, 70, 80, 90]
test[:] = []
print(test)
# []

removeで削除

最後にremoveを使った削除方法について解説する。今まではインデックスを指定して削除するという方法だった。しかしremoveは要素を指定して削除するというもの。

test = [30, 60, 70, 80, 90]
test.remove(60)
print(test)
# [30, 70, 80, 90]

ただし、気をつけないといけないのが、最初に見つかった要素を削除するという点。以下では3060の間に90を追加してremoveしてみた。

するとその90だけが削除され、もともと最後尾にあった90は残ったままであることが確認できる。

test = [30, 90, 60, 70, 80, 90]
test.remove(90)
print(test)
# [30, 60, 70, 80, 90]

また、存在しない要素を指定するとエラーになる。

test = [30, 60, 70, 80, 90]
test.remove(100)
print(test)
#     test.remove(100)
# ValueError: list.remove(x): x not in list

.remove.append, .insertと同じように戻り値がないのでprintしてもNoneが返される。

test = [30, 60, 70, 80, 90]
print(test.remove(60))
# None

listの結合(マージ)

listの作り方、要素の追加と削除ができてlistを作成したとする。ここで、複数のlistを一つにした方がいいと考えた場合はどうすればいいか。list同士を結合(マージ)すればいい。

シンプルに+

まずはシンプルに足し算する方法。+の後のlistが後ろに追加される。

test1 = [30, 60]
test2 = [70, 80, 90]
test = test1 + test2
print(test)
# [30, 60, 70, 80, 90]

.extendで追加

.extendを使用することでlistの後ろにlistを追加することができる。ただし、.appendなどと同じように、=を使わない。

test1 = [30, 60]
test2 = [70, 80, 90]

test1.extend(test2)
print(test1)
# [30, 60, 70, 80, 90]

したがって、test = のように新たな変数として置いたとしてもNoneが返されるだけだ。あくまでも既存のlistに追加するという形を取っている。

test = test1.extend(test2)
print(test)
# None

listsort

これまではlistは昇順で書いていたが、もしも順番がバラバラの場合はどうやって昇順にすればいいのか。そんな時は順番を変更すればいい。

.sort

また出てきた.シリーズ。.sortlistを昇順に並び替える。

test = [60, 70, 90, 80, 30]
test.sort()
print(test)
# [30, 60, 70, 80, 90]

逆に降順にしたい場合は引数としてreverse=Trueを選択すればいい。初期状態だとFalseだ。

test = [60, 70, 90, 80, 30]
test.sort(reverse=True)
print(test)
# [90, 80, 70, 60, 30]

もちろん.sortprintしてもNone

test = [60, 70, 90, 80, 30]
print(test.sort())
# None

sorted

.sortの場合は既存のlistを変更するものだったが、既存は残したい場合はsortedを使用する。

test = [60, 70, 90, 80, 30]
sorted_test = sorted(test)
print(sorted_test)
# [30, 60, 70, 80, 90]

こちらも降順にしたい時はreverse=Trueにする。

test = [60, 70, 90, 80, 30]
sorted_test = sorted(test, reverse=True)
print(sorted_test)
# [90, 80, 70, 60, 30]

listtuple

最後にlistに近いtupleを紹介する。list[]を使用していたのに対し、tuple()を使用する。ただし、ここで気をつけないといけないのは、tupleを作成するには,が必ず必要なこと。

以下の例では,を入れるか入れないかで変数のtypeがどう変わるのかを調べた。

tpl = (30,)
num = (30)

print(tpl)
# (30,)
print(type(tpl))
# <class 'tuple'>

print(num)
# 30
print(type(num))
# <class 'int'>

(30,)とした変数tplではtupleとして認識されている一方、(30)としたnumではintとして認識されている。この点には注意が必要だ。

listtupleの主な違いは以下の2つ。

  • 変更可能か否か
  • 速度

変更可能か否か

まず、変更可能かどうかについてだが、listの場合は以下のようにして要素を変更することができた。

lst = [30, 60, 70, 80, 90]
lst[1] = 55
print(lst)
# [30, 55, 70, 80, 90]

一方でtupleの場合はこの方法で要素を変更することができない。一応、要素を変更する方法は存在するが面倒だし実用的ではないのでここでは省く。

tpl = (30, 60, 70, 80, 90)
tpl[1] = 55
#     tpl[1] = 55
# TypeError: 'tuple' object does not support item assignment

速度

tupleは要素の変更ができないということもあり、listよりもコードの実行が早いらしい。しかし、微微たる差であるのでそこまで気にしなくて良い。

使い分け

結局のところlsittupleの使い分けは以下のようにすればいい。

  • 要素の変更を行う:list
  • 要素の変更を行わない:tuple

まあ、そこまで深く考えなくてもいいだろう。

配列を使い始めてからが本当の始まり

pythonではlist以外にも多くの配列が存在する。そしてありとあらゆる場面で配列は使われる。その中で配列の考え方がわかっていないとpythonがしんどくなると思われる。

これらの配列の基礎的なものはlistにあると思うので本記事でlistへの理解を深めていただければ幸いだ。

関連記事

【python&独学】独学である程度pythonを習得するマインド

続きを見る

【辞書の結合】dictのマージ

続きを見る

多項式関数のグラフ
【辞書&pandas】dict{name: , val: {a: [~], b:[~]}}のpandas化

続きを見る

【python3.7以降&dictのkeys】ネスト(入れ子)されたdictのkeys一覧をカッコで出力

続きを見る

ガジェット

2023/9/18

【デスクツアー2022下半期】モノは少なく、でも効率的に Desk Updating #0

今回はガジェットブロガーなのにデスク環境を構築していない執筆者の ...

ライフハック

2023/9/16

【Audible vs YouTube Premium】耳で聴く音声学習コンテンツを比較

ワイヤレスイヤホンが普及し耳で学習することへのハードルが格段に下 ...

完全ワイヤレスイヤホン(TWS)

2023/9/18

【SENNHEISER MOMENTUM True Wireless 3レビュー】全てが整ったイヤホン

今回は高音質・高機能なSENNHEISERのフラグシップ完全ワイヤレスイヤホン「SENNH ...

ライフハック

2023/3/11

【YouTube Premiumとは】メリットしかないから全員入れ

今回はYouTube Premiumを実際に使ってみてどうなのか、どんなメリット/デメリット ...

マウス

2023/8/17

【Logicool MX ERGOレビュー】疲れない作業効率重視トラックボールマウス

こんな人におすすめ トラックボールマウスの王道Logicool MX ERGOが気になるけどऩ ...

ベストバイ

2023/9/18

【ベストバイ2022】今年買って良かったモノのトップ10

2022年ベストバイ この1年を振り返って執筆者は何を買ったのか。ガジェッ& ...

スマホ

2023/1/15

【楽天モバイル×povo2.0の併用】月1,000円の保険付きデュアルSIM運用

こんな人におすすめ 楽天モバイルとpovo2.0のデュアルSIM運用って実際のとこ ...

マウス

2023/9/16

【Logicool MX ERGO vs MX Master 3】ERGOをメインにした決定的な理由

こんな疑問・お悩みを持っている人におすすめ 執筆者はLogicoolのハイエンӠ ...

macOSアプリケーション

2022/9/30

【Chrome拡張機能】便利で効率的に作業できるおすすめの拡張機能を18個紹介する

こんな人におすすめ Chromeの拡張機能を入れたいけど、調べても同じような ...

macOSアプリケーション

2023/5/3

【Automator活用術】Macで生産性を上げる作業の自動化術

今回はMacに標準でインストールされているアプリ「Automator」を使ってできる ...

Pythonを学びたいけど独学できる時間なんてない人へのすゝめ

執筆者は大学の研究室・大学院にて独学でPythonを習得した。

でも社会人になったら独学で行うには時間も体力もなくて大変だ。

時間がない社会人だからこそプロの教えを乞うのが効率的。

ここでは色んなタイプに合ったプログラミングスクールの紹介をする。

  • この記事を書いた人

メガネ

Webエンジニア駆け出し。独学のPythonで天文学系の大学院を修了。常時金欠のガジェット好きでM2 Pro MacBook Pro(30万円) x Galaxy S22 Ultra(17万円)使いの狂人。自己紹介と半生→変わって楽しいの繰り返しレビュー依頼など→お問い合わせ運営者情報、TwitterX@m_ten_pa、 YouTube@megatenpa、 Threads@megatenpa

-Python基礎
-,