sec02 - listの編集
スポンサーリンク

要素の上書き

1つの要素番号を指定し、データを上書きする

listの要素を上書きする時は、var[n] = dataのように記述します。要素番号を指定し、上書きしたいデータとイコールで結びます。

次のコードを実行し、指定した要素番号のデータが上書きされたことを確認しましょう。

sample_list = ['a', 'b', 'c', 'd', 'e']
sample_list[0] = 1
print(sample_list)  # [1, 'b', 'c', 'd', 'e']
print(len(sample_list))  # 5

上記コードは、要素番号[0]の要素を1に上書きします。要素数は、元データの5から変化していません。

次に、listのデータを、要素番号[0]に上書きしてみます。

sample_list = ['a', 'b', 'c', 'd', 'e']
sample_list[0] = [1, 2, 3]
print(sample_list)  # [[1, 2, 3], 'b', 'c', 'd', 'e']
print(len(sample_list))  # 5

上記コードは、インデックス[0]の要素を[1, 2, 3]に上書きします。要素数は、元データの5から変化していません。

単一の要素番号を指定して上書きする場合、置き換えられるデータは加工されずに、その要素番号の位置に置き換えられます。この挙動は分かりやすいでしょう。

スライスで指定し、データを上書きする

スライスでlist範囲を指定する場合は、var[n:m] = iterable_dataのように記述します。ここで注意しなければならないのは、代入(上書き)するデータはイテラブル(iterable)でなければなりません。

イテラブル(iterable)とは

イテラブル(iterable)とは『反復可能な』という意味です。"イテラブルなデータ型"をざっくり説明すると、次のようになります。

  • listのように複数の値を持つことができるデータ型
    • list, tuple, dict, set, string
      ※ stringも、複数の文字情報を持っていると言えるため、イテラブルなデータ型の仲間になります
      ※ 数値(int, float)は、イテラブルなデータ型ではありません
  • データを逐次生成できるオブジェクト
    • データ構造のセクションの中で学習する、range()関数が返すrangeオブジェクトなどが該当します
      ※ rangeオブジェクトは、指定した範囲の数値を順番に生成し、値を返すオブジェクトです

イテラブル(iterable)については、専用のレクチャーでより詳細に解説します。このレクチャーでは、スライスの範囲指定(var[n:m])をしたうえでデータを上書きしたい時には、数値のようなイテラブルでないデータ型は代入できないという事を覚えておいてください。(ただし、[1]のようにlistの要素として数値が入っているのはOKです。)

それでは、スライスで範囲指定して、データを上書きする具体例をみていきましょう。

まずは、sample_listの[0:4]の範囲に、[1]を代入します。次のコードを実行してみましょう。

sample_list = ['a', 'b', 'c', 'd', 'e']
sample_list[0:4] = [1]
print(sample_list)  # [1, 'e']
print(len(sample_list))  # 2

結果は、[1, 'e']が返されます。[0:4]の範囲の要素が、ごっそり置き換わっています。そして、代入された値は"[1]"ではなく、listの要素が展開されて"sample_list"の要素に組み込まれています。つまり、[[1], 'e']のように、list("[1]")がそのまま置き換えられるわけではなく、listの要素が展開されて、展開された1[0:4]の範囲に置き換わることになります。

次に、複数の要素を持つlistで置き換えてみましょう。

sample_list = ['a', 'b', 'c', 'd', 'e']
sample_list[0:1] = [1, 2, 3]
print(sample_list)  # [1, 2, 3, 'b', 'c', 'd', 'e']
print(len(sample_list))  # 7

結果は、[1, 2, 3, 'b', 'c', 'd', 'e']が返されます。[0:1]の範囲は[0]と同じことになりますが、スライスで範囲指定した時は必ず、イテラブルなデータ型が持っている値が展開されて置き換わります。

要素番号を1つ指定した場合と、スライスで範囲指定した場合の違いは次の通りです。

  • sample_list[0] = [1, 2, 3]
    • # [[1, 2, 3], 'b', 'c', 'd', 'e']
  • sample_list[0:1] = [1, 2, 3]
    • # [1, 2, 3, 'b', 'c', 'd', 'e']

+ 演算子

listを+演算子で結合することができます。文字列の時と同じで、違うデータ型との演算はできません。必ずlist同士で+演算子を使用します。

次のコードを実行して、挙動を確認しましょう。

sample_list = ['a', 'b', 'c']
new_sample_list = sample_list + [1, 2, 3]
print(new_sample_list)  # ['a', 'b', 'c', 1, 2, 3]
print(sample_list)  # ['a', 'b', 'c'] (元のlistは変わらない)

上記コードは、変数"sample_list"の['a', 'b', 'c'][1, 2, 3]+演算子で結合し、新しいlistを生成します。生成されたlistは、変数"new_sample_list"へ代入されています。

新しく生成されたlist(['a', 'b', 'c', 1, 2, 3])には、元の2つのlistの要素が順番に格納されます。尚、変数"sample_list"の中身は変わりません。

スポンサーリンク

* 演算子

*演算子を使用すると、元のlistの要素を指定した回数だけ繰り返した新しいlistを生成できます。これは文字列の繰り返しと同じような挙動です。

次のコードを実行して、挙動を確認しましょう。

sample_list = ['a', 'b', 'c']
new_sample_list = sample_list * 4
print(new_sample_list)  # ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
print(sample_list)  # ['a', 'b', 'c'] (元のlistは変わらない)

['a', 'b', 'c']の要素が4回繰り返された新しいlistが生成され、変数"new_sample_list"に代入されます。

スポンサーリンク