Python初心者が理解しやすい、基本のキから解説するシリーズ。
今回はPythonにおける配列のような変数 list (リスト)の初期化・宣言、値の代入について解説しています。
- 空のリストを作成したい
- 値を指定してリストを作成したい
- 値 + 要素数を指定してリストを作成したい
- 他の変数の値を利用してリストを作成したい
リストの扱い方について、現役のエンジニアが解説しています。
結論
空のリストを作成するには [] で初期化します。
l = []
print(l)
# []
特定の値をもつリストを作成するには、その値をカンマ区切りで渡せばOKです。
l = [0, 1, 2, 3]
print(l)
# [0, 1, 2, 3]
要素数が決まっており、ある規則にしたがった値を持つリストを作るには、次のように
* 演算子や range()関数を利用します。
l = [9] * 10
print(l)
# [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
l = list(range(0, 12, 2))
print(l)
# [0, 2, 4, 6, 8, 10]
リスト内包表記を使えば、一行(ワンライナー)でリストを柔軟に作成できます。
l = [i**2 for i in range(6)]
print(l)
# [0, 1, 4, 9, 16, 25]
他の変数の値を利用してリストを作るには、以下のようにします。
文字列の場合
s = 'hoge fuga'
l = list(s)
print(l)
# ['h', 'o', 'g', 'e', ' ', 'f', 'u', 'g', 'a']
タプルの場合
t = ('foo', 'bar', 'baz')
l = list(t)
print(l)
# ['foo', 'bar', 'baz']
辞書の場合
d = {'a': 'foo', 'b': 'bar', 'c': 'baz'}
l = list(d.keys())
print(l)
# ['a', 'b', 'c']
l = list(d.values())
print(l)
# ['foo', 'bar', 'baz']
l = list(d.items())
print(l)
# [('a', 'foo'), ('b', 'bar'), ('c', 'baz')]
実行環境
Python 3.9.2
空のリストを作成
空(長さ0)のリストを作成するには、[]で初期化します。
l = []
print(l)
# []
print(len(l))
# 0
次のようにしても空のリストを生成できます。これは何となく確認しておけば十分です。
l = list()
print(l)
# []
(脱初心者向け)これは、listクラスを使うと任意のオブジェクト(イテラブル)からリスト変数を作成できますが、コンストラクタに何も渡さない場合は空のリストを返す仕様を利用しています。
値を指定してリストを作成
任意の値を持つリストを作成するには次のようにします。
ここでは整数の組み合わせを指定しています。
l = [0, 1, 2, 3]
print(l)
# [0, 1, 2, 3]
print(len(l))
# 4
指定したとおりの値が格納されたリストが作成されましたね。
もちろん、整数値以外も指定できます。例えば文字列の値だと次のようになります。
l = ['a', 'b', 'c']
print(l)
# ['a', 'b', 'c']
値 + 要素数を指定してリストを作成
* 演算子を使う方法
任意の長さだけ連続した値を持つリストは次のように作成します。
ここでは * 演算子を使って、リストを同じ要素で拡張しています。
l = [9] * 10
print(l)
# [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
同じ値ではなく、同じパターンを連続する場合は次のようにします。シンプルで理解しやすいですね。
l = [1, 2, 3] * 3
print(l)
# [1, 2, 3, 1, 2, 3, 1, 2, 3]
range()関数を使う方法
同じように、ある規則に従った値のリストを作るとき range() 関数を使うと簡単です。
range() 関数は、ある規則で連続した値の組み合わせを生成します。
例えば for文で0から4まで1ずつ増加させて繰り返したいときは、次のようにrange()関数に5を渡します。
for i in range(5):
print(i)
# 0
# 1
# 2
# 3
# 4
list()にrange()で生成したオブジェクトを渡せばリストになるので、次のようにlist(range())としてみましょう。
range(stop)
l = list(range(5))
print(l)
# [0, 1, 2, 3, 4]
このときの関係は
0 <= 要素 < stop
となります。
また、次のように始点も指定できます。
range(start, stop)
l = list(range(2, 5))
print(l)
# [2, 3, 4]
このときの関係は
start <= 要素 < stop
となります。
要素同士の間隔を変更することもできます(デフォルト=1)
range(start, stop, step)
l = list(range(0, 12, 2))
print(l)
# [0, 2, 4, 6, 8, 10]
このときの関係は
start <= n*step < stop
となります。
リスト内包表記を使う方法
ある規則(式)に従った値のリストを作成するなら、リスト内包表記を利用する方法もあります。
リスト内包表記は1行だけでシンプルにリストを作成できるので、Pythonではよく使われるテクニックです。
後で説明するように、速度面でのメリットもあります。
2ずつ大きくなる整数(等差数列)のリストを作成するには次のようにします。
l = [i*2 for i in range(6)]
print(l)
# [0, 2, 4, 6, 8, 10]
構文は次のようになっています。
[変数を使った式 for 変数 in オブジェクト]
オブジェクトには既にあるリストやタプル、rangeなどの繰り返し可能なもの(イテラブル、iterableといいます)を指定します。
これとまったく同じ結果は for文とlist.append()を使って次のように書けます。
l = []
for i in range(6):
l.append(i*2)
print(l)
# [0, 2, 4, 6, 8, 10]
リスト内包表記で書くほうがスッキリしていますね。
また、for文とappend()で1要素ずつ追加する方法より、リスト内包表記のほうが処理が高速です。少なくとも上のような簡単なリスト生成では、リスト内包表記を使うべき場面が多いでしょう。
5. データ構造 — Python 3.9.4 ドキュメント
他の変数の値を利用してリストを作成
リストの初期化では、すでに定義された変数の値を使用できます。
a = 10
b = 20
c = 40
l = [a, b, c]
print(l)
# [10, 20, 40]
ここで、リストに使用された変数の値を変更しても、リストの値は変化しません。
a = 99
print(l)
# [10, 20, 40]
リストの値を変更するときは次のようにリストを直接操作します。
l[0] = 99
print(l)
# [99, 20, 40]
タプルからリストへ変換
タプル(tuple) からリストに変換するには次のように list() に渡します。
t = ('foo', 'bar', 'baz')
print(t)
# ('foo', 'bar', 'baz')
l = list(t)
print(l)
# ['foo', 'bar', 'baz']
文字列から文字のリストを作成する
文字列(str)から各文字をリストとして取り出すには、次のようにlist()に渡します。
s = 'hoge fuga'
print(s)
# hoge fuga
l = list(s)
print(l)
# ['h', 'o', 'g', 'e', ' ', 'f', 'u', 'g', 'a']
1文字ずつではなく、カンマやスペースなどの区切り文字で分けたリストを作成するには、次のようにsplit()関数を活用します。
data = 'hoge,piyo,fuga'
l = data.split(',')
print(l)
# ['hoge', 'piyo', 'fuga']
辞書のキー、値からリストを作成する
辞書(dict)はキー、値の要素があるので、それぞれを分けてリストにすることになります。
キーの取得はkey()、値の取得はvalues()、キーと値の組み合わせをタプルで取得するのはitems()を呼びます。
d = {'a': 'foo', 'b': 'bar', 'c': 'baz'}
print(d)
# {'a': 'foo', 'b': 'bar', 'c': 'baz'}
l = list(d.keys())
print(l)
# ['a', 'b', 'c']
l = list(d.values())
print(l)
# ['foo', 'bar', 'baz']
l = list(d.items())
print(l)
# [('a', 'foo'), ('b', 'bar'), ('c', 'baz')]
Pythonの学習法について
Python の勉強が辛くなっていませんか?
Pythonは比較的取り組みやすい言語と言われていますが、プログラミング初心者にとっては分からないことだらけ。
ゼロから独学で勉強するのは厳しい道のりです。
今回、様々な現場、システム、言語を経験してきた現役エンジニアの立場から、初心者でも挫折しない学習方法を解説する記事を書きました。もちろん、お金をかけずに習得できる方法も解説しています。
できるだけストレスがかからない勉強法を解説しているので、ぜひ参考にしてみてくださいね。
今回参考にしたページ・資料
5. データ構造 — Python 3.9.4 ドキュメント