Select Language

AI Technology Community

2.15、Pythonリスト精説

Pythonのリスト(list)は、複数の要素から構成される順序付きの集合です。

私たちは、リストを使って密接に関連する要素をまとめることができます。例えば、あるクラスに28人の生徒がいる場合、クラスのリストを作成し、その中に28個の要素を含めることができます。各要素は1人の生徒に対応します。リストは順序付きであるため、学籍番号でソートすることができ、これにより、あるクラスのすべての生徒を表す生徒リストが得られます。

1. リストの定義

Pythonでは、[ ]を使ってリストを定義します:

>>> list1 = [1, 2, 3]  # リストlist1を定義
>>> type(list1)        # list1の型を確認
<class 'list'>


もう1つのリストを構築する方法は、list(オブジェクト)を使用することです。これは、別のオブジェクトからデータをコピーして新しいリストを構築します。入力されるオブジェクトは通常、集合データであり、つまり、多数の要素を含むデータです。例えば、文字列は文字の集合と見なすことができます。

>>> list('123')
['1', '2', '3']


リストは空にすることができます。つまり、要素を含まないリストです。空のリストは[ ]で表されます。

>>> a = []  # 空のリスト
>>> len(a)  # リストの要素数は0
0

2. リストの特性

リストは、これまでに説明したデータ型とは大きく異なり、一連の要素の集合です。他のプログラミング言語にも似たデータ型がありますが、Pythonのリストには独自の特性があります。

1) 異種性

Pythonのリストは、要素の型が同じである必要はありません。これは、C言語やJava言語の配列とは大きく異なります。

>>> a = [1, 2.3, "hello", [1, 2]]  # 4つの要素を持つリストを構築
>>> type(a[0])                     # 最初の要素の型は整数型
<class 'int'>
>>> type(a[1])                     # 2番目の要素の型は浮動小数点数
<class 'float'>
>>> type(a[2])                     # 3番目の要素の型は文字列
<class 'str'>
>>> type(a[3])                     # 4番目の要素の型はリスト
<class 'list'>

2) 要素数の可変性

C言語やJava言語の配列では、要素数は定義時に決定され、後で変更することはできません。一方、Pythonのリストは要素数に制限がなく、実行時に動的に変化させることができます。例えば、末尾に要素を追加したり、先頭に要素を挿入したりすることができます。

このような操作を行うと、リストの要素数も変化します。

>>> a = [1, 2, 3]   # リストaを構築
>>> len(a)          # aには3つの要素がある
3
>>> a.append(4)     # 末尾に要素4を追加
>>> a               # aの内容を確認
[1, 2, 3, 4]
>>> len(a)          # 現在、aの要素数は4
4
>>> a.insert(0, 0)  # 先頭に0を挿入
>>> a               # aの内容を確認
[0, 1, 2, 3, 4]
>>> len(a)          # aの要素数は現在5
5

3) 要素の直接アクセス

これは、C言語やJava言語の配列と同様に、特定の位置を指定してリスト内の要素にアクセスすることができます。例えば、最初の要素や最後の要素などです。

もう1つの一般的なデータ構造はリンクリストですが、リンクリストでは任意の要素に直接アクセスすることはできません。例えば、3番目の要素の値を取得するには、まず最初の要素にアクセスし、その要素から2番目の要素を見つけ、さらに2番目の要素から3番目の要素を見つける必要があります。

>>> a = list(range(1, 100))  # 99個の要素を持つリストを生成
>>> len(a)                   # 要素数を取得
99
>>> a[10]                    # 11番目の要素にアクセスし、その値を取得
11

4) オブジェクト表現

これまでの説明から、リスト内の任意の要素にアクセスする時間は同じであることがわかります。これは、C、C++、Javaの配列と同じです。しかし、すべての要素の型が同じである必要はなく、同じメモリ空間を占有する必要もありません。これはどのように実現されているのでしょうか?

以下に、リスト [1,"hello"12.5,""] を例に、そのメモリ内のオブジェクトモデルを図1に示します。

リストのオブジェクトモデル
図1:リストのオブジェクトモデル

4. リストの一般的な操作

以下に、リストデータの一般的な操作を説明します。

1) 要素数の取得——len()

len() 関数を使って、特定のリストに含まれる要素数を取得することができます。

>>> len([])         # 空のリストの要素数は0
0
>>> len([1, 2, 3])  # 3つの要素を含むリスト
3

2) 特定の要素の取得——リスト[位置]

「リスト[位置]」を使って特定の要素を表すことができ、その要素の値を読み取ったり、変更したりすることができます。

>>> list1 = [1, 2, 3]  # リストを定義
>>> list1[1]           # 2番目の要素の値を確認
2
>>> list1[1] = 100     # 2番目の要素の値を変更
>>> list1              # リストの内容を確認
[1, 100, 3]

3) 末尾への要素の追加——append()

結果として、要素数が1つ増え、リスト自体のidは変化しません。

>>> list_obj1 = [1, 2, 3]
>>> id(list_obj1)
4346456544
>>> list_obj1.append(12)
>>> list_obj1
[1, 2, 3, 12]
>>> id(list_obj1)
4346456544

4) 特定の値の出現回数の取得——count()

一度も出現しない場合、0が返されます。

>>> list_obj1 = [1, 1, 2, 3, 4]  # リストを作成
>>> list_obj1.count(1)           # リスト内で値が1の要素の数は2
2
>>> list_obj1.count(2)           # リスト内で値が2の要素の数は1
1
>>> list_obj1.count(20)          # リスト内で値が20の要素の数は0
0

5) 別のリストの要素の末尾への追加——extend(新しいリスト)

新しいリストの要素を元のリストの末尾に追加し、元のリストのデータが変更されます。

>>> list_obj1 = [1, 2, 3]        # 新しいリストを作成
>>> list_obj2 = [10, 20, 30]     # 別の新しいリストを作成
>>> id(list_obj1)                # 最初のリストのidを取得
4346331936
>>> id(list_obj2)                # 2番目のリストのidを取得
4346393520
>>> list_obj1.extend(list_obj2)  # 2番目のリストの内容を最初のリストに順次追加
>>> id(list_obj1)                # 最初のリストのidは変化しない
4346331936
>>> id(list_obj2)                # 2番目のリストのidも変化しない
4346393520
>>> list_obj1            
post
  • 26

    item of content
Pythonの基本データ型は全部で26章あります。
この章では、整数型、浮動小数点数、文字列、ブール型、リスト、タプル、セットおよび辞書など、Pythonが提供する基本的なデータ型について紹介します。また、これらのデータ型に対する演算操作についても解説します。
私たちはPythonが強タイプ言語であることを知っています。つまり、各変数の型は特定の時点でのみ確定します。言い換えれば、Pythonにおける任意の生存しているオブジェクトの型は一意です。異なる型のオブジェクトには異なる属性があり、異なる操作を実行できます。
さらに、この章の最後では変数やオブジェクトなどの概念についても触れられます。それぞれのオブジェクトには確定した型があり、各変数は特定のオブジェクトを指し示します。