Python入門 配列(リスト)を初期化したいのですが?

配列(リスト)を初期化したいのですが?

ここでは配列(リスト)を初期化する方法をまとめる。

リスト(配列)を初期化するには、幾つかの方法があります。
・角かっこ「[]」内に、その要素をカンマ「,」で区切って並べていく
・list関数にその要素となるものを格納している反復可能オブジェクトを与える
・リスト内包表記を使用する

では順番に見ていきましょう。

リスト(配列)の初期化:角かっこ「[]」で囲み、要素をカンマ「,」区切りで並べる

要素を持たない空のリスト(空の配列)を作成するには、角かっこに何も含めないか、後で見るlist関数に引数を指定しないで呼び出せばよいです。

empty_list = []  # 空のリスト
print(empty_list)  # []

リストに要素を含めるには、それらをカンマで区切って並べていきます。

int_list = [0, 1, 2]  # 整数リスト(整数配列)
print(int_list)  # [0, 1, 2]

要素には、インデックスを用いてアクセスしたり、for文で列挙したりすることで使用できます。

print(int_list[0])  # 先頭要素にアクセス:1
print(str_list[-1])  # 末尾要素にアクセス:baz
for item in str_list:
  print(item)  # foo、bar、bazが順番に表示される

nt型の配列には整数しか格納できない、ということをよく聞きますが、Pythonのリストではそういうことはありません。

mylist = [0, 'abc', 1, 'def']  # リスト(配列)には任意の型の要素を格納できる
print(mylist)  # [0, 'abc', 1, 'def']

リスト(配列)の初期化:list関数を呼び出す

リスト(配列)は、list関数を使っても作成できます。
このときには、既に見たように引数を指定しなければ空のリストが作成されます。
そうでないときには、リストの要素となるものを格納している反復可能オブジェクトを引数に指定します。

int_list = list()  # 空のリスト(配列)
print(int_list)  # []

反復可能オブジェクト(タプル)からリストを作成

int_tuple = (0, 1, 2)
int_list = list(int_tuple)  
print(int_list)  # [0, 1, 2]

タプルの要素を基にリスト(配列)が作成される

int_list = list((4, 5, 6))  
print(int_list)  # [4, 5, 6]

rangeオブジェクトから整数リスト(整数配列)を作成

int_list = list(range(5))  
print(int_list)  # [0, 1, 2, 3, 4]

文字列の各文字を要素とするリストを作成

str_list = list('python')  
print(str_list)  # ['p', 'y', 't', 'h', 'o', 'n']

リスト内包表記

 Pythonではリスト内包表記という方法でもリスト(配列)を初期化できる。その基本構文は次のようになっています。

[変数を使って要素の値を計算する式 for 変数 in 反復可能オブジェクト]

実際にはこれは、以下のfor文と同じ意味となります。

結果を保存するリスト = []
for 変数 in 反復可能オブジェクト:
    結果を保存するリスト.append(変数を使って要素の値を計算する式)

rangeオブジェクトからリストを作成

int_list = [x for x in range(0, 10, 2)]  
print(int_list)  # [0, 2, 4, 6, 8]

if節を用いる例

 リスト内包表記のfor節には続けてif節を記述できます。
これは反復可能オブジェクトから取り出した値が特定の条件に合致するときにだけ、「変数を使って要素の値を計算する式」の評価を行うために使用します。

int_list = [x for x in range(10) if x % 2 == 1]  
print(int_list)  # [1, 3, 5, 7, 9]

if else式を使うときにはfor節に続けずに、内包表記の先頭に記述する

変数xに取り出した値が条件に合致しないときにも、何らかの値を算出したいという場合がある。
そうしたときには、for節に続けてif節を記述するのではなく、要素の値を計算する式の中で三項演算子(if式)を記述します。

str_list = [c.upper() if c.islower() else c.lower() for c in 'AbCdE']
print(str_list)  # ['a', 'B', 'c', 'D', 'e']

ここでは、反復可能オブジェクトとして文字列’AbCdE’を用いている。
新しく作成するリストの要素の値を計算する式は「c.upper() if c.islower() else c.lower()」です。
これは、文字列の個々の文字が小文字かどうかを調べて、小文字であればそれをupperメソッドで大文字化して、そうでなければlowerメソッドで小文字化します。
よって、元の文字列とは大文字小文字が反転したものを要素とするリストが得られるということです。

リストのリスト(配列の配列)

最後にリストのリスト(配列の配列)、つまりリストを要素とするリストの初期化についても簡単に見ておく。といっても、難しいことはなく、角かっこの中にさらに角かっこを使って記述していくだけだ。あるいは、角かっこの中に既存のリストを置いてもよい。

2次元のリスト(配列)の作成

mylist = [[0, 1, 2], [3, 4, 5]]  
print(mylist)  # [[0, 1, 2], [3, 4, 5]]

リスト内包表記でリストのリストを作成するには、リスト内包表記の内部でもう一度リスト内包表記を使用します。

mul_tbl = [[x * y for x in range(1, 4)] for y in range(1, 5)]
print(mul_tbl)  # [[1, 2, 3], [2, 4, 6], [3, 6, 9], [4, 8, 12]]

上のコードと同等なコードをfor文で書き下すと次のようになる。

mul_tbl = []
for y in range(1, 4):
    tmp = []
    for x in range(1, 5):
        tmp.append(x * y)
    mul_tbl.append(tmp)

print(mul_tbl)  # [[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12]]

書籍の紹介

Nクイーン問題(45)第七章 キャリーチェーン Python編

Nクイーン問題(45)第七章 キャリーチェーン Python編

Python入門 配列(リスト)をコピーしたいのですが?

Python入門 配列(リスト)をコピーしたいのですが?