🔙
🔝

リスト型

「データ配列」のしくみがわかるようになります

Chatpter.1 - リストとは

リストとは

  • 値が列になっているデータです。😺❓

  • こんな風に書きます。

    lst_num = [0, 1, 2, 3, 4]
    lst_str = ['あ', 'い', 'う', 'え', 'お']
    
  • 文 」のところで range() が化けた時に見た形がこんなのでした。

  • 1つの変数にたくさんの値をしまっておけるおもちゃ箱のようなものです。

  • [ ] の中に、値をカンマ , で区切って入れていきます。

  • このリストには、見えていないけど前から順番に整理番号が付いています。

  • 番号は、前から順番に 0, 1, 2, 3, 4, ・・・ と付いています。

  • この整理番号のことを「要素番号ようそばんごう」と言います。

  • このリスト型のデータ全体 [ ] のことを「リスト」と言います。

  • リストの中のそれぞれの値がある場所のことを「要素ようそ」と言います。

  • リストの中に入っている要素の個数のことを「要素数ようそすう」と言います。

  • 表にすると以下の通りです。

    データ lst_str = ['あ', 'い', 'う', 'え', 'お']
    要素番号 左から順に 0 1 2 3 4
    または 左('あ')から順に -5 -4 -3 -2 -1
    リスト ['あ', 'い', 'う', 'え', 'お']
    要素 [要素, 要素, 要素, 要素, 要素]
    要素数 5
    要素は、要素の中の値も含めて要素と言います。

  • 要素番号は 必ず0番から始まります。 1番からではありません。
    よって一番最初ではなく、「ゼロ番最初」になります。(混乱しやすい所)

  • 予備知識として、リスト型変数は複数形名詞を命名する慣習があります。

    単数形 複数形 (list)
    int num nums
    str country countries
    str member members
    str word words, words_list
  • 気にしすぎて命名に時間をかけるのはよくありません。

  • 慣れてきてから少しずつ気にして命名してみてください。

Chatpter.2 - なんでリスト使うの?

なんでリスト使うの?

  • こんな風に使えて便利だから!!!

    a_gyou = ['あ', 'い', 'う', 'え', 'お']
    
    for moji in a_gyou:   # range()の時の形と同じです
        print(moji)
    





  • 一部分だけ利用できる!

    a_gyou = ['あ', 'い', 'う', 'え', 'お']
    print(a_gyou[3])
    

    a_gyou[3] の数字を 0 ~ 4 の間の数字に書き換えてみましょう!

  • 一部分だけの書き換えもできる!

    a_gyou = ['あ', 'い', 'う', 'え', 'お']
    a_gyou[2] = 'ウ'
    print(a_gyou)
    
    ['あ', 'い', 'ウ', 'え', 'お']
  • 好きな範囲だけの利用も自在にできる!!!

    a_gyou = ['あ', 'い', 'う', 'え', 'お']
    
    print(a_gyou[1:3])    # range()と同じで 3 でストップします
    print(a_gyou[:2])
    print(a_gyou[2:])
    
    ['い', 'う']
    ['あ', 'い']
    ['う', 'え', 'お']
  • 一部分を取り除いたりすることもできる!

    a_gyou = ['あ', 'い', 'う', 'え', 'お']
    del a_gyou[1]       # 'い' を削除
    print(a_gyou)
    
    a_gyou.pop(2)       # a_gyou.pop(2) が 'え' に化ける
    print(a_gyou)
    
    a_gyou.remove('あ') # 最初の 'あ' が削除される
    print(a_gyou)
    
    ['あ', 'う', 'え', 'お']← 消したら前に詰めて、要素番号 0 1 2 3 になる ['あ', 'う', 'お']← 消したら前に詰めて、要素番号 0 1 2 になる ['う', 'お']← 消したら前に詰めて、要素番号 0 1 になる

    a_gyou.pop(2)'え' に化けても、'え'を変数に入れないとそのまま消えてしまう為、結果「削除」しただけになります。 .pop() の説明はまた今度!

  • もちろん好きな所にも挿入できる!

    a_gyou = ['あ', 'う', 'え', 'お']
    a_gyou.insert(2, 'い')
    print(a_gyou)
    
    ['あ', 'う', 'い', 'え', 'お']
  • リストとリストをくっつける!

    a = ['か', 'わ', 'し', 'た']
    b = ['や', 'く', 'そ', 'く']  
    
    connect = a + b
    print(connect)
    
    ['か', 'わ', 'し', 'た', 'や', 'く', 'そ', 'く']
  • とにかく一番うしろに追加したい!!(よく使います)

    a_gyou = ['あ', 'い', 'う', 'え']
    a_gyou.append('お')
    print(a_gyou)
    
    ['あ', 'い', 'う', 'え', 'お']
  • 順番を逆にするのも簡単です。

    a_gyou = ['あ', 'い', 'う', 'え', 'お']
    print(a_gyou[::-1])
    
    ka_gyou = ['か', 'き', 'く', 'け', 'こ']
    ka_gyou.reverse()
    print(ka_gyou)
    
    ['お', 'え', 'う', 'い', 'あ']
    ['こ', 'け', 'く', 'き', 'か']
  • 小さい順や、あいうえお順に整列することもできます。(ソートと言います)

    nums = [3, 11, 5, 7, 2]
    nums.sort()   # 昇順 (小さいほうから順に)
    print(nums)
    
    words = ['ね', 'こ', 'ぱ', 'ん', 'ち']
    words.sort()
    print(words)
    
    words.sort(reverse = True)  # 降順 (大きいほうから順に)
    print(words)
    
    nums.sort(reverse = True)
    print(nums)
    
    [2, 3, 5, 7, 11]
    ['こ', 'ち', 'ね', 'ぱ', 'ん']
    ['ん', 'ぱ', 'ね', 'ち', 'こ']
    [11, 7, 5, 3, 2]

    「え・・・めんどくさい・・・」という時はコピペしてラクをしてみよう!

  • こんな風にリストにすると、各要素の値を自在に操作することができるようになります。

【 わりと難しい話 】

  • 上に出てきた .pop().sort() というのは、変数の後ろに付けると、リストをいろいろ簡単に操作することができる指示にあたります。

  • 関数みたいなものですが、ほんの少し違います。『メソッド (method)』と言います。

  • 関数と違って、リスト型の変数の後ろに . をつけてからメソッド名を書きます。上のプログラムみたいに。

  • ( ) の中に値や追加指示(reverse=Trueとか)を与えたりします。


  • わりと難しい話なのに頑張って読んでくれたお礼に、ひと足先にリストでよく使うメソッドを紹介します。

    メソッド名 ( ) の中身 機能
    append() 値をリストの末尾に追加する
    pop() 要素番号 要素の値を取り出す (取り出した値に化けます)
    sort() reverse ソートする。reverse=Trueで降順
    remove() ( ) 内の値を1つ取り除く

    append() はとてもとてもよく使います。
    ※ 他にもいろいろあります。

Chatpter.3 - 添字とスライス

添字とスライス

3.1 - 添字

添字

  • まずリストをそのまま出力してみます。

    print(['あ', 'い', 'う', 'え', 'お'])
    
    ['あ', 'い', 'う', 'え', 'お']

    lst_str = ['あ', 'い', 'う', 'え', 'お']
    print(lst_str)
    
    ['あ', 'い', 'う', 'え', 'お']
  • 要素番号を使って、リストの一部分の要素だけ利用することもできます。

    str の書き方と比べてみてください。

    # str型の場合
    s0 = 'あ'
    s1 = 'い'
    s2 = 'う'
    s3 = 'え'
    s4 = 'お'
    
    print(s0)
    print(s1)
    print(s2)
    print(s3)
    print(s4)
    






    # list型の場合
    s = ['あ', 'い', 'う', 'え', 'お']
    
    print(s[0])
    print(s[1])
    print(s[2])
    print(s[3])
    print(s[4])
    





  • 添字そえじとは、変数の右側の [ ] の中に書く数のことです。

  • でも、[ ] も含めて [数] で添字と言ったりもします。

  • 1つの変数で済む利便さより、添字を変えるだけでリストの値を自由に利用できる利便さの為に使われます。😺❓

  • その代わり要素番号がどこにも記されていないので、前から順番に 0 1 2... と番号が割り振られているという想像力が必要になります。

3.2 - スライス

スライス

  • リストの値を範囲で扱うための便利機能です。

  • 便利すぎて超使う!

  • 料理でいうところの包丁にあたります。

  • リストの値を好きな所から好きな長さに切り取ったり、それぞれを変数に切り分けたり、とにかくいろいろできます。

  • スライスは、添字をこんな風に書いて使えます。

    [start:stop:step] ['(-5)(0)', '(-4)(1)', '(-3)(2)', '(-2)(3)', '(-1)(4)'] 範囲
    [1:4] ['い', 'う', 'え'] 1 2 3
    [:4] ['あ', 'い', 'う', 'え'] 0 1 2 3
    [2:] ['う', 'え', 'お'] 2 3 4
    [:] ['あ', 'い', 'う', 'え', 'お'] 0 1 2 3 4
    [::2] ['あ', 'う', 'お'] 0 2 4
    [1::2] ['い', 'え'] 1 3
    [::-1] ['お', 'え', 'う', 'い', 'あ'] -1 -2 -3 -4 -5

  • range() とほとんど同じです。

  • range() と違うのは、start:stop:step それぞれ数を省略できるところです。

  • range()stop だけ省略できませんでした。スライスはどこでも省略できます。

  • start を省略すると 0 から。

  • stop を省略すると、start から後ろ全部。

  • step を省略すると 1 で、1つずつ。(普通)

  • [:] または [::] と書くと全部。


    実はこのスライス、文字列にも使えるんです❗❗❗


  • 文字列でスライスを使ってみるとこんな感じです。

    string = '【新番組】点々つけたらスライスになった件'
    print(string[5:])
    
    点々つけたらスライスになった件

    string = '【新番組】点々つけたらスライスになった件'
    s1 = string[5:6]
    s2 = string[10:12]
    print(s1 + s2)
    
    点スラ

    string = 'ねるねるねるねるね'
    print(string[::2])
    print(string[1::2])
    
    ねねねねね
    るるるる

    string = 'こいくのにふせしくかゅを'
    for i in range(3):
        print(string[i::3])
    
    このせか
    いにしゅ
    くふくを
  • リストや文字列の一部分を切り出したい時は、すぐに『スライス』を思い出してください。

  • step もかなり使えますよ!!

Chatpter.4 - ぼくたちは代入ができない

変数をそのまま代入するときは要注意

  • ここから、かなりややこしくなります。難しいです。

  • すぐに必要な知識ではありませんので、よくわからなかったら飛ばして全然OKです。

  • どんな型のでも、値を変数に代入することはできます。

  • でも変数から変数に、値をそのまま代入できない場合もあります。

  • 変数2 = 変数1

    このやり方を「コピー(copy)」または「値のコピー」と言います。

  • 変数のまま 変数2変数1 を代入する(コピーする)ことが、

    できる! できない!
    str list
    int dict
    tuple set

    ※ まだ学んでいない型は細字になっています。

  • strint は今までどおり、何も気にしないでコピーできます。

    comic1 = 'こめといものふつうの暮らし 2巻'
    comic2 = comic1
    print(comic1)
    print(comic2)
    
    こめといものふつうの暮らし 2巻comic1 こめといものふつうの暮らし 2巻comic2

  • comic12巻1巻 に書き換えてみます。

    comic1 = 'こめといものふつうの暮らし 2巻'
    comic2 = comic1
    comic1 = 'こめといものふつうの暮らし 1巻'
    print(comic1)
    print(comic2)
    
    こめといものふつうの暮らし 1巻1巻に書き換わる こめといものふつうの暮らし 2巻 

    とくに問題はありません。ふつうですね。

  • 次にリスト型変数 (list) を、別の変数にコピーしてみます。

    comics1 = ['こめと', 'いもの', 'ふつうの', '暮らし', '2巻']
    comics2 = comics1
    print(comics1)
    print(comics2)
    
    ['こめと', 'いもの', 'ふつうの', '暮らし', '2巻']comics1 ['こめと', 'いもの', 'ふつうの', '暮らし', '2巻']comics2

  • comics12巻1巻 に書き換えてみます。

    comics1 = ['こめと', 'いもの', 'ふつうの', '暮らし', '2巻']
    comics2 = comics1
    comics1[4] = '1巻'   # comics1 のみ '1巻' に書き換える
    print(comics1)
    print(comics2)
    
    ['こめと', 'いもの', 'ふつうの', '暮らし', '1巻']comics1 ['こめと', 'いもの', 'ふつうの', '暮らし', '1巻']comics2

  • 両方とも「1巻」になってしまいました・・・。


  • comics2 には全く触っていないのに、勝手に「1巻」にされてしまいました。
    これは大問題ですね。

  • コピー元のリスト型変数は、そのままではリストに化けてくれないのです。

  • こうなってしまう原因を説明するのは、とても難しいです。

  • コピーのことをきちんと説明すると、余計にどんどん難しくなっていきます。

  • 今はただ リスト型変数コピーできないことだけ覚えておいてください。

  • けど、大雑把に例えを使って説明してみます。

  • ケーキが1つあります。🍰

  • このケーキを😾が食べると、ケーキは無くなります。

    😾の分のケーキなので、どう食べようと自由です。


  • ケーキが1つあります。🍰

  • この1つのケーキを、今度は😾と😺のふたりで一緒に食べます。

    😾 🍰
    😺

  • 1つのケーキをふたりで食べるわけですから、ひとりが食べるとふたり分のケーキが減っていきます。

    😼 💥
    🙀

  • でも以下の方法ならリストに化けてくれますので、問題なく代入することができます。

    nums1 = [1, 2, 3, 4, 5]
    nums2 = nums1[:]  # nums1 の全ての要素を スライスを使って選択
    nums1[2] = 6
    print(nums1)
    print(nums2)
    
    ↓ コピーではなく、リストの要素すべてを代入する
    nums1 = [1, 2, 3, 4, 5]
    nums2 = [1, 2, 3, 4, 5]  # nums1 のリストに化けてから代入される
    nums1[2] = 6
    print(nums1)
    print(nums2)
    
    [1, 2, 6, 4, 5]
    [1, 2, 3, 4, 5]
  • スライスの代わりに list() 関数を使うやり方もあります。

    nums1 = [1, 2, 3, 4, 5]
    nums2 = list(nums1)  # リストをリストに変換する
    nums1[2] = 6
    print(nums1)
    print(nums2)
    
    ↓ 元のリストの値を、新しいリストに移し替えている感じ
    nums1 = [1, 2, 3, 4, 5]
    nums2 = [1, 2, 3, 4, 5]  # 移し替えたリストが化けてから代入される
    nums1[2] = 6
    print(nums1)
    print(nums2)
    
    [1, 2, 6, 4, 5]
    [1, 2, 3, 4, 5]
  • 😾の分のケーキが1つあります。🍰

  • 😺がやってきたので、もう1つ同じケーキ🍰を用意します。(コピー)

    😾 🍰
    😺 🍰


  • 😾がケーキを食べます。

    🙀 💥
    😸 🍰


  • 別に用意された😺の分のケーキ🍰は無事(?)です。

  • 「あれ?リストの値が勝手に変わる・・・」と思ったら、このことを思い出してください。

  • もしどーーーしても詳しく知りたい方は、「シャローコピー」「ディープコピー」でネット検索してみてください。