Python/リスト

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

リスト[編集]

数値や文字列といった、いくつものデータを、ひとつにまとめる事ができます。

たとえば、 (下記のコードは不要)

a = 10
b = "asdf"
c = 30

と書かなくても、

かわりに、

matome = [10 ,"asdf" ,30]
print(matome)

と、書くことができます。

このように、pythonには変数をひとまとめにできる機能があり、上記のコードのような[ ]をもちいた機能はリストといいます。


リスト内の項目の順番は、プログラムを書くときに数え方では、左から順に0から数えます。

たとえば、上記のコードのリストmatomeでは、0番目の中身は数値「10」です。 リストmatomeの1番目の項目の中身は、数値「"asdf"」です。

たとえば、

matome = [10 ,"asdf" ,30]
print(matome[1])

上記のコードを実行すると、

asdf

が表示されます。matome[1]とは、「リストmatomeのうちの、1番目」の意味ですが、しかしリストの数え方では、左から順に0番目から数えるので、リストの1番目とは、左から2つめにある数のことですので、表示されるのは文字列「asdf」なわけです。


リストの各項目を、代入・置き換えすることもできます。

matome = [10 ,"asdf" ,30]
matome[0] = 4
print (matome)

上記のコードを実行すると、表示されるのは、 [4, 'asdf', 30]

です。「10」が「4」に置き換わっています。


リストに文字列が混ざっていても、そのリスト中にある数値だけの要素は、数値型として扱われているので、加減乗除などの計算が可能です。

コード例
matome = [10 ,"asdf" ,30]
print(matome[0] + matome[2])

の実行結果は

40

となるように( 10 + 30 なので)、数値だけの要素は、数値型として認識している事が分かります。


リストと文字列[編集]

リストの項目は、文字列だけ、あるいは数値だけでも、かまいません。

文字列だけのリストの場合、たとえば

matome = ["aaa" ,"bb" ,"cccc"]
matome[0] = 4
print(matome)

上記のコードを実行すると、表示されるのは、

[4, 'bb', 'cccc']

です。

for文との組み合わせ[編集]

リストは、for文の条件としても、そのまま使えます。( for文単独の仕組みについては、『Python/条件分岐と繰り返し』で説明ずみ。 )この場合、"range" は不要です。もし range をつけて in range としてしまうと、整数値として認識してしまうので、下記コードの場合はエラーになってしまいます。

うごくコード例
# 人名リスト
jinmei = ["yamada" ,"sato" ,"inoue"] 

for i in jinmei:
    print(i)


実行結果

yamada
sato
inoue

他プログラミング言語の関係[編集]

pythonにかぎらず、C言語やJavaScriptでは、「配列」というものを定義する際、

pythonのリストとは、やや表記は違いますが、記述方法が似ています。

C言語の「配列」(array)とは、python「リスト」とは、やや記述方法が違うところもあります。

たとえば

matome = [10 ,20 ,30]

のような記述は、JavaScript では類似の記述で可能です(行末のセミコロンの有無と、変数宣言で「var matome」のように「var」があるかどうかの違いだけ)。ですが、C言語では波カッコに変わり、「int matome = {10 ,20 ,30}; 」のようなコードに変わるハズです。

このように、JavaScript の「配列」(array)と、Pythonの「リスト」とは、記述の方法がほぼ同じです。


C でも JavaScript でも、たとえば配列では、角カッコ [ ] と数字の組み合わせで、配列とその中の何番目かの要素を表したりします。

また、C でも JavaScript でも配列の宣言の際に、カンマで要素を1つずつ区切ったりもできます。


このようにリストと配列の類似点は多いので、当面のあいだ初心者は、「リストは配列のようなもの」と思っておいても(当面は)十分でしょう。


しかし、「配列」では一般に、要素中での数値と文字列との混在はできません。少なくとも、C言語の「配列」はそうです。

仮にC言語以外の別言語の「配列」で、数値と文字列との混在が出来たとしても、なるべく利用者の混乱をふせぐために、混在をさけたほうが安全でしょう。


実際、JavaScript の配列の宣言文を、ソースコードの少ない修正作業で、プログラマーはpythonのリストに書き換えることもできます。

論より証拠で、実際にpythonプログラムの一部を書き換えてみて、書き換え後の内容としては wikibooks『JavaScript/配列』にある配列の宣言文にある、角カッコとその内側の部分(たとえば [ 'A', 'B', 'C', 'D', 'E' ] など )というJavaScript 文をそのままマウスで コピーペーストして、本pythonのリストの表示プログラムの matome = [10 ,20 ,30]の部分を上書きしても、pythonとして動きます。


別言語のリストの類似物

なお、Pyhtonに「配列」というデータ型は存在しないです。C言語などに、配列 array というデータ型があります。

ややこしい事に、他のプログラム言語には、「配列」データ型と「リスト」データ型とが別個に存在するものもあります。 (たとえば Kotlin という言語には、配列(array)データ型と、リスト list データ型とが別々に存在する。) なお、kotlin は現在では、Android スマホのアプリ開発などで、よく使われる言語です。

Python に配列は無いので、混同しないようにしましょう。

なお、別プログラミング言語であるGo言語にあるのは「リスト」ではなく「スライス」slice です。(Go言語スライスの機能はPyhtonやkotlinの「リスト」と似ている。)Go言語にも、「配列」array データ型と「スライス」slice データ型とがあり、よく混同します。なお、Go言語は、サーバ開発などで使われる言語です。検索エンジン大手のグーグルがGo言語の開発を主導しています。

もちろん、Python にスライスは無いです。Pythonにあるのは、「スライス」ではなく「リスト」です。

kotlin も Go言語も、2020年の近年はよく聞くので、混同しないように。

項目の追加[編集]

リストの項目に、あとから追加することもできます。

matome = ["aaa" ,"bb" ,"cccc"]
matome.append("d")
print(matome)

上記のコードを実行すると、表示されるのは、

['aaa', 'bb', 'cccc', 'd']

です。


項目の削除[編集]

リストの項目を、あとから削除することもできます。次のコードのようにpop()を使うと、リスト右端の項目を削除できます。

matome = ["aaa" ,"bb" ,"cccc"]
matome.pop()
print(matome)

上記のコードを実行すると、表示されるのは、

['aaa', 'bb']

です。

項目の右端を削除したいリストのうしろに「.pop()」をつけることで、項目の右端を削除していけます。

なお、この.pop()のような、操作したい対象物のうしろにドット記号(.)と操作内容のキーワードをつける表記のことをpythonでは、「メソッド」といいます。


matome.pop()をくりかえすと、さらに右端から、削除していきます。

matome = ["aaa" ,"bb" ,"cccc"]
matome.pop()
matome.pop()
print(matome)

上記のコードを実行すると、表示されるのは、

['aaa']

です。

その他のデータ構造[編集]

Pythonのデータ構造の機能には、リスト型のほかにも、辞書型や集合型やタプル型など、(pythonには)その他のデータ構造もあります。

タプルは一度、作成したあとは、もう要素を変更できません。タプルは要素の追加や削除も、作成したあとでは、できません。だからオライリー本が言うには、タプルは要するに「定数リスト」だと断言されているくらいです[1]

また、このようなタプルの変更不能の性質のため、普段はめったにタプルを使わないのが実情だとも、オライリー本では言われています[2]。オライリー本が言うには、複数の要素をまとめる場合に普段使うのは、ほとんどがリスト型または辞書型だろうとのことです。

map関数[編集]

map関数 (マップかんすう)を使うと、リストの全部の要素に、一括で何かの関数を処置する事ができます。

たとえば、数値だけからなるリストをもとに、それぞれの要素の絶対値を得るリストは、下記のようになります。

map(処置したい関数, リスト名)

の書式で使います。


コード例
matome = [-7 , -2, 5]

# 絶対値をabsで得る
obje= list(map(abs, matome) )

print(obje)


実行結果

[7, 2, 5]


なお、objeに代入する行で、もし list()関数 をつけずに

obje= map(abs, matome) 

としても、print時に

<map object at 0x7fd1c082b130>

のようにアドレスのようなものが表示されるだけで、うまく行かない。


python組込済みの abs 関数だけでなく、ユーザ定義した独自関数でもmap関数で処置する事が可能です。なおユーザ定義関数そのものの説明については、単元『Python/関数』 を参照のこと。


コード例
matome = [-7 , -2, 5]

# +3するだけの処置
def kansu(a):
    return a+3

obje= list(map(kansu, matome) )

print(obje)


実行結果

[-4, 1, 8]


filter 関数[編集]

filter関数 (フィルターかんすう)は、リストの各要素の中から、条件に適合するものだけを選び出して、新たなリストを作ります、

書式は

filter(lambda 変数名:(条件式) , リスト名) 

です。

filter(lambda 変数名: 条件式 , リスト名) 

のように、条件式のカッコを省くこともできます。


コード例
matome = [5 , 2, 8, 6, 1 ]

# 3以上の要素を抽出
obje= list(filter(lambda x:(x >= 3)  , matome) )

print(obje)


実行結果
[5, 8, 6]


lambda ラムダ というのは、pythonには既に lambda という機能があり、python のlambda は、関数名の無い関数です。

このfilter関数の場合、map関数と同様にfilter関数も、引数に関数を使う仕様ですが、条件式はそのままでは関数ではないので、条件式をむりやり関数にするために lambda を流用している仕組みです。

python の本来の理念である、初心者の教育むけの平易なプログラム言語というコンセプトからすると、「lambda 」という処理はやや技巧的な感じがしますが、しかし当面は lambda が今後しばらくは使われ続けると思われるので、利用者は妥協しましょう。


pythonにかぎらずプログラム言語の仕様なんて、5年や10年もたてばコロコロと変わるので、目先の細々として仕様だけを追いかけるのではなく、仕様の全体像を把握するようにしましょう。


なお、lambda を使わなくても、下記のようにユーザ定義関数を def で宣言することでも、filter関数を使える。この場合、 return の部分に、条件式を書く。


コード例
matome = [5 , 2, 8, 6, 1 ]

def hantei(x):
    return x >= 3

obje= list(filter(hantei, matome) )

print(obje)

だが、この方法だと、関数を見た時に、それがなんの関数だか、コメントなどが無いとづらい欠点がある。また、return のあとの戻り値に条件式を書くのは、pythonのfilter関数以外では、めったに行われない風習なので、集団作業ではメンテナンス上の理由で、さけたほうが良い。


lambda はあまりエレガント(洗練・優美)な感じがしないが、しかし関数の戻り値を条件判定にするのは、もっとエレガントではないので、まだしも妥協して lambda を使うほうがマシだろう。


参考文献[編集]

  1. ^ Bill Lubanovic 著『入門python3』,OREILLY、斉藤康毅 監訳、長尾高弘 訳、2017年2月3日 初版 第6刷発行、67ページ、
  2. ^ Bill Lubanovic 著『入門python3』,OREILLY、斉藤康毅 監訳、長尾高弘 訳、2017年2月3日 初版 第6刷発行、68ページ、