リスト(list)は「複数の値を1つのまとまりにして扱えるようにする機能」のことです。
複数の値をまとめて扱う機能は他にもありますが(タプルや辞書など)、その中でもリストが最も基本的な方法と言えます。
リストについては複数回に渡って解説しますが、ここでは「初期化」にフォーカスしていきます。
- リストって何?
- リストはどうやって初期化するの?
- リストの応用的な初期化方法が知りたい!
といった方の疑問へ回答しつつ、リストについて深く知っていきましょう。
目次
リスト(list)の作り方
リストの作り方(初期化)を解説します。
リストの作り方は主に4つありますので、それぞれ見ていきましょう。
また、最後に多次元リストの初期化についても解説します。
基本的なリストの初期化方法
最も基本的なリストの初期化方法から見ていきましょう。
リストを初期化するには次のようにします。
書式 [要素1, 要素2, 要素3 ... 要素n]
実際に初期化したサンプルがこちらです。
numbers = [3, 14, 15, 92, 65, 35]
strings = ["なまむぎ", "なまごめ", "なまたまご"]
print(numbers)
print(strings)
結果 [3, 14, 15, 92, 65, 35] ['なまむぎ', 'なまごめ', 'なまたまご']
numbersには数値を、stringsには文字列の要素が含まれています。
カンマの後に空白を入れていますが、これはただ見やすくするためのものなので、あってもなくても問題ありません(私は慣習的に入れています)。
また、リストの要素は型が異なっていても問題ありません。
mixes = [3, "こんにちは", True, 0.314]
print(mixes)
結果 [3, 'こんにちは', True, 0.314]
また、要素が一つも入っていない「空のリスト」を作ることもできます。
例えば後でforで繰り返しながらリストに要素を追加していきたい場合等で空のリストを初期化することがあります。
empty_list = []
print(empty_list)
結果 []
要素を繰り返したリストを作成する
同じ要素を繰り返したリストを作成する場合は「*」演算子を使うと簡単です。
例えば「とりあえず全ての要素を0で初期化しておきたいな」といった場合に役立ちます。
numbers_1 = [0, 0, 0, 0, 0]
numbers_2 = [0] * 5 #↑と同じ意味合い
print(numbers_1)
print(numbers_2)
結果 [0, 0, 0, 0, 0] [0, 0, 0, 0, 0]
また、複数の要素が入ったリストの場合は、その複数要素の並び順のまま繰り返されたリストが作成されます。
mixes = [3, "こんにちは", True, 0.314]
mixes_by_3 = mixes * 3
print(mixes_by_3)
結果 [3, 'こんにちは', True, 0.314, 3, 'こんにちは', True, 0.314, 3, 'こんにちは', True, 0.314]
list()を使ってリストを初期化する
次は組み込み関数のlist()を使ってリストを初期化する方法を見ていきましょう。
list()はPythonに最初からインストールされている関数で、range()や文字列を引数に与えることでリストを作成してくれます。
まずはrange()を使って指定した値の間の数値の連番が入ったリストを作成してみましょう。
range_list = list(range(-3, 4))
print(range_list)
結果 [-3, -2, -1, 0, 1, 2, 3]
連番のリストが作成されました。
rangeの終了値を「4」にしているのは「0」から数えられているからです。
今回のように「-3から3」までとしたい場合は「3」ではなく+1した「4」にする必要があるので注意しましょう。
では次に文字列をlist()を使ってリストに変換しましょう。
文字列をリストにすると、一つ一つの文字が1要素になり、バラバラになります。
実際に見てみましょう。
aomaki = "あおまきがみあかまきがみきまきがみ"
chars = list(aomaki)
print(chars)
結果 ['あ', 'お', 'ま', 'き', 'が', 'み', 'あ', 'か', 'ま', 'き', 'が', 'み', 'き', 'ま', 'き', 'が', 'み']
ちなみに、リストの内容を文字列に変換する場合はjoin()関数を使います。
strings = ["あおまきがみ", "あかまきがみ", "きまきがみ"]
joined_strings = "".join(strings)
print(joined_strings)
結果 あおまきがみあかまきがみきまきがみ
多次元リストを初期化する
次に多次元リストの初期化について見ていきましょう。
リストの要素にリストを入れることで多次元のリストを初期化することができます(リストのネスティング、または単にネストと言います)。
では多次元リストを初期化してみましょう。
list_1 = [["あおまきがみ"], ["あおまきがみ"], ["きまきがみ"]]
list_2 = [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]
print(list_1)
print(list_2)
結果 [['あおまきがみ'], ['あおまきがみ'], ['きまきがみ']] [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]
list_1はリストの要素にリストが入っているので「2次元リスト」と呼びます。
list_2は2次元リストの中にさらにリストが入っているので「3次元リスト」と呼びます。
つまり階層によって多次元リストの呼び方が変わります。3次元リストにさらに一つ階層を追加すれば「4次元リスト」になります。
リストの初期化に改行を使う
先ほどの多次元リストですが、2次元リストならまだ良いですが、3次元リストともなると相当見にくかったと思います。
多次元リストを初期化する場合は改行を使うことでとても見やすくなり、ミスが減ります。
list_1 = [
["あおまきがみ"]
,["あおまきがみ"] #コメントを記述できる
,["きまきがみ"]
]
list_2 = [
[
[1, 2]
,[3, 4]
,[5, 6]
]
,[
[7, 8]
,[9, 10]
,[11, 12]
]
]
print(list_1)
print(list_2)
#結果は同じ
改行することでどの括弧とどの括弧が対応しているのかが分かりやすくなりました。
改行する場合でもカンマは必要です(私はカンマは前付け派ですが、後付けでも問題ありません)。
リスト内包表記を使ってリストを初期化する
初期化編の最後に、応用的な初期化方法である「リスト内包表記」を解説します。
リスト内包表記とは「for..inを使って、イテラブルオブジェクトから新しいリストを作成する」タイプの初期化方法です。
イテラブルとはリストやタプル、辞書のような「値に含まれている要素を一つ一つ取り出せるタイプのオブジェクト」のことです。
つまりリストを使って新しいリストを作ったりできるのがリスト内包表記ということになります。
書式 [式 for 要素 in イテラブル]
では実際にリスト内包表記を使ってリストを初期化してみましょう。
import math
float_list = [3.14, 1.20, 81.99, 31.24, 1.02]
int_list = [math.floor(num) for num in float_list]
print(int_list)
結果 [3, 1, 81, 31, 1]
少し複雑ですが、上のプログラムでやってることは「floorを使って少数を切り捨てて、新しいリストを作成している」だけです。
重要なのは内包表記の式のところです。式の内容によって作成されるリストが変わってきます。
また、リスト内包表記では条件式を追加することで「条件に合った要素のみを取り出して新しいリストを作成」できます。
書式 [式 for 要素 in イテラブル if 条件式]
先ほどのプログラムに「2以上80以下」という条件式を加えます。
import math
float_list = [3.14, 1.20, 81.99, 31.24, 1.02]
int_list = [math.floor(num) for num in float_list if 2 <= num <= 80] #2以上80以下
print(int_list)
結果 [3, 31]
1.20、1.02は2未満、81.99は80超過なので、3.14と31.24のみリストに格納されました。
リスト内包表記でfor..inを複数含める
リスト内包表記では1次元のイテラブルしか扱えない訳ではなく、2次元以上のリストを使うこともできます。
多次元リストをリスト内包表記で扱うには「for..inを複数含める」と、最も深い要素を取得できるようになります。
これは実際に見てみたほうが早いでしょう。次のコードを見てください。
lists = [[3, 6, 9], [12, 15, 18]]
line_list = [num * 2 for list in lists for num in list]
print(line_list)
結果 [6, 12, 18, 24, 30, 36]
上のコードでは、まずlistsの要素をlistに一つずつ取り出ています。
listsは2次元リストなのでlistにはリストが取り出されているので、2つ目のfor..inでnumにリストの値を取り出しています。
最後にnumに2を乗算した値をline_listに格納しています。
for..inを2つ含めることで、多次元の配列の要素を一つ一つ取り出すことができました。
関連記事
[blogcard url=”https://webhack.jp/programming/%e3%80%90python%e5%88%9d%e5%bf%83%e8%80%85%e5%90%91%e3%81%91%e3%80%91%e3%83%aa%e3%82%b9%e3%83%88list%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bc%81-2/?preview_id=6971&preview_nonce=310ef66c08&post_format=standard&_thumbnail_id=6680&preview=true”] [blogcard url=”https://webhack.jp/programming/%e3%80%90%e5%88%9d%e5%bf%83%e8%80%85%e5%90%91%e3%81%91%ef%bc%81%e3%80%91python%e3%81%a8%e3%81%af%ef%bc%9f%e7%89%b9%e5%be%b4%e3%81%a8%e5%9f%ba%e6%9c%ac%e7%9a%84%e3%81%aa%e6%a7%8b%e6%96%87/?preview_id=6661&preview_nonce=b976cd9387&post_format=standard&_thumbnail_id=6680&preview=true”]