Pythonの基礎 - リストの作成と操作

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

ここでは、リスト型のデータを扱う。
リストは、0個以上の複数のデータを一覧にして管理することができる。

Pythonのリスト型は、異なる種類のデータ型を格納できる。


リストの作成とインデックス

リスト型変数の宣言

Pythonのリストを作成するには、角括弧[]を使用する。 この中に、カンマを使用して要素を区切って記述する。

 a = [1, 2, 3, 4, 5]
 b = [6, 7, 8, "apple", "python"]


list関数でリストを作成する

上記のように、リストは角括弧[]で要素を括ることで作成できるが、list関数を使用してリストを作成する方法もある。

 x = list()
 y = list("python")
 print(x)
 print(y)
 
 # 出力
 []
 ['P', 'y', 't', 'h', 'o', 'n']


インデックスを指定しリストの要素を取り出す

インデックスを使用して、リストから要素を取り出すには、その中に取り出したいインデックスを指定する。

 a = ["a", "b", "c", "d", "e"]
 print(a[0])
 print(a[1])
 print(a[-1])
 print(a[-2])
 
 # 出力
 a
 b
 e
 d


リストのスライス

要素のスライスも文字列と同様にできる。また、範囲指定して取り出すこともできる。

 a = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
 print(a[0:3])
 print(a[:3])
 print(a[6:])
 print(a[:])
 print(a[::2]
 print(a[::-2])
 
 # 出力
 ['a', 'b', 'c']
 ['a', 'b', 'c']
 ['g'. 'h', 'i', 'j']
 ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
 ['a', 'c', 'e', 'g', 'i']
 ['j', 'h', 'f', 'd', 'b']


リストのリスト – リストの入れ子

リストには全ての型を入れることができるので、リストを入れ子構造で作成することもできる。
以下のように、リストxとyは、それぞれ文字列と数字のリストになっている。
リストzは、数値、文字列、そしてリストx、yを要素に持つリストになっている。

 x = ["Twitter","Facebook","LINE"]
 y = [100, 200, 300]
 z = [1, 2, "apple", x, y]
 
 print(z)
 print(z[3])
 print([4][0])
 
 # 出力
 [1, 2, 'apple', ['Twitter', 'Facebook', 'LINE'], [100, 200, 300]]
 ['Twitter', 'Facebook', 'LINE']
 100


リストの要素の削除

上記に続けて、delキーワードを使用してインデックスで指定した要素を削除する。

 x = ["Twitter","Facebook","LINE"]
 y = [100, 200, 300]
 z = [1, 2, "apple", x, y]

 del z[4][0]
 
 print(z)
 
 # 出力
 [1, 2, 'apple', ['Twitter', 'Facebook', 'LINE'], [200, 300]]



リストのメソッド(append関数 pop関数 count関数 sort関数など)

上記のように、リストは角括弧[]で要素を囲んで作成した。また、インデックスを使用して抽出、スライスを行った。
リストには他にも様々なメソッドが用意されている。
ここでは、リストにおいて、より使用するメソッドについて扱う。

append関数で末尾に要素を追加する

リストに要素を加える方法として、append関数がある。
これを利用することで、リストの末尾に要素を1つずつ加えることができる。

 lang = ["C", "C++", "Java", "PHP", "Ruby"]
 lang.append("python")
 print(lang)
 
 # 出力
 ['C', 'C++', 'Java', 'PHP', 'Ruby', 'Python']


extend関数でリストを結合する

2つのリストを結合する場合は、extend関数を使用する。
また、+=演算子を使用して結合することもできる。

 l = [1, 2, 3]
 m = [10, 20, 30]
 l.extend(m)
 print(l)
 
 # 出力
 [1, 2, 3, 10, 20, 30]


insert関数で要素を追加する

insert関数を使用すれば、インデックスを使用してリスト中の指定の位置に要素を追加することができる。
インデックスの最初の要素は0から始まる。

 lang = ["C", "C++", "Java", "PHP", "Ruby"]
 lang.insert(2, "Python")
 print(lang)
 
 # 出力
 ['C', 'C++', 'Python', 'Java', 'PHP', 'Ruby']


スライス機能

開始インデックスと終了インデックスを指定して、リストの指定した範囲の要素を別の要素と入れ替えることができるが、
開始インデックスと終了インデックスに共に新しい要素を挿入するインデックスを指定することにより、要素を指定した位置に挿入することができる。

右辺に指定したリストを、リストの指定したインデックスの要素の前に挿入する。

 mylist = ["a", "b", "c"]
 addlist = ["d", "e"]
 
 # 別のリストををインデックス1の前に挿入
 mylist[1:1] = addlist
 print(mylist)
 
 # 出力
 ['a', 'd', 'e', 'b', 'c']


remove関数で要素を削除する

remove関数を使用すれば、削除したい要素のインデックスが不明でも、要素そのものを指定してリストから削除することができる。

 lang = ["C", "C++", "Java", "PHP", "Ruby"]
 lang.remove("Java")
 print(lang)
 
 # 出力
 ['C', 'C++', 'PHP', 'Ruby']


pop関数で要素を取り出し削除する

pop関数を使用すれば、インデックスを指定して要素を取り出し削除することができる。
以下の例では、インデックス2の要素をpop関数で削除している。
また、インデックスを指定せずにpop関数を実行する場合、末尾の要素が削除される。これは、pop(-1)と記述しても同様である。

 strnum = ["one", "two", "three", "four"]
 strnum.pop(2)
 print(strnum)
 
 strnum.pop()
 print(strnum)
 
 # 出力
 ['one', 'two', 'four']
 ['one', 'two']


index関数で要素の位置を調べる

リストの中のある要素が、どのインデックスにあるのかを調べるには、index関数を使用する。

 x = [1, 4, 3, 4, 2, 6, 1, 4, 7, 3, 5, 5, 9]
 x.index(6)
 print(x)
 
 # 出力
 5


in演算子で要素の有無を調べる

リストの中に要素が入っているかを調べるには、in演算子を使用する。
要素が存在する場合はTrue、存在しない場合はFalseを返す。

 x = [1, 4, 3, 4, 2, 6, 1, 4, 7, 3, 5, 5, 9]
 print(7 in x)
 print(8 in x)
 
 # 出力
 True
 False


sort関数、reverse関数で並び替える

リストの要素を並び替える場合は、昇順ならsort関数、降順ならreverse関数を使用する。
また、sort関数で降順ソートする場合は、reverseオプションにTrueを指定する。
sort関数およびreverse関数を使用すると、表示を並び替えるというのではなく、リスト自体の要素を並び替えて変更する。

 x = [1, 4, 3, 4, 2, 6, 1, 4, 7, 3, 5, 5, 9]
 print(x.sort())
 print(x.sort(reverse=True))
 print(x.reverse())
 
 # 出力
 [1, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 9]
 [9, 7, 6, 5, 5, 4, 4, 4, 3, 3, 2, 1]
 [1, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 9]


count関数で特定の要素の個数を数える

リスト内に特定のデータがいくつ格納されているか調べる場合は、count関数を使用する。
以下の例では、4が3つ存在する。

 x = [1, 4, 3, 4, 2, 6, 1, 4, 7, 3, 5, 5, 9]
 x.count(4)
 print(x)
 
 # 出力
 3


split関数で分割した後、join関数で結合する

文字列をセパレータで分割してリストに格納し、そのリストから再び文字列に結合する。
split関数で分割した後、再びjoin関数で結合する。

以下の例では、まず、セパレータをスペース(" ")で分割してリスト化した後、再びjoin関数で結合している。

 s = "I am playing with Python."
 
 list_split = s.split(" ")
 print(list_split)
 
 j = " ".join(list_split)
 print(j)
 
 # 出力
 ['I', 'am', 'playing', 'with', 'Python.']
 I am playing with Python.


len関数で要素数を調べる

リストに含まれている要素の数を数えるにはlen関数を使用する。

 x = [1, 4, 3, 4, 2, 6, 1, 4, 7, 3, 5, 5, 9]
 print(len(x))
 
 # 出力
 13



リストのコピーと注意点

注意点

リストをコピーする際に注意する点がある。
リストのコピーには、そのリストをコピーしたものがもう1つの独立したリストとして扱える形になったり、
コピーしてもコピー元のデータが変わるとコピー先のデータも変化するパターンがある。

これは、メモリの内部的な参照先が同じデータであるか、独立したものであるかの違いがあるからである。

リストをコピーする

リストのコピーの方法はいくつか存在する。

代入演算子(=)を使用してコピーする
代入演算子を使用する場合、リストaとbは、メモリの同一のアドレスに格納されているデータを参照するので、
リストaの内容を変更するとリストbの内容も変化する。

 a = ["YouTube", "Instagram", "LINE"]
 b = a
 a[1] = "Twitter"
 print(a)
 print(b)
 
 # 出力
 ['Youtube', 'Twitter', 'LINE']
 ['Youtube', 'Twitter', 'LINE']


また、リストaもbも同一のアドレスを参照しているかどうかは、id関数を使用して調べることができる。

 a = ["YouTube", "Instagram", "LINE"]
 b = a
 id(a)
 id(b)
 
 # 出力
 4495475016
 4495475016


copy関数を使用してコピーする(list関数とスライスも含む)
コピーしたリストが同一のアドレスを参照するものではなく、独立した別のデータとして扱うには、copy関数を使用する。
また、同じことができるlist関数とスライス[:]も併せて使用する。

 a = ["YouTube", "Instagram", "LINE"]
 b = a.copy()
 a[1] = "Twitter"
 print(a)
 print(b)
 
 # 出力
 ['YouTube', 'Twitter', 'LINE']
 ['YouTube', 'Instagram', 'LINE']


 a = ["YouTube", "Instagram", "LINE"]
 b = list(a)
 a[1] = "Twitter"
 print(a)
 print(b)
 
 # 出力
 ['YouTube', 'Twitter', 'LINE']
 ['YouTube', 'Instagram', 'LINE']


 a = ["YouTube", "Instagram", "LINE"]
 b = a[:]
 a[1] = "Twitter"
 print(a)
 print(b)
 
 # 出力
 ['YouTube', 'Twitter', 'LINE']
 ['YouTube', 'Instagram', 'LINE']