
Table of Contents(目次)
要素の上書き
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)とは『反復可能な』という意味です。"イテラブルなデータ型"をざっくり説明すると、次のようになります。
- listのように複数の値を持つことができるデータ型
- list, tuple, dict, set, string
※ stringも、複数の文字情報を持っていると言えるため、イテラブルなデータ型の仲間になります
※ 数値(int, float)は、イテラブルなデータ型ではありません
- list, tuple, dict, set, string
- データを逐次生成できるオブジェクト
- データ構造のセクションの中で学習する、range()関数が返すrangeオブジェクトなどが該当します
※ 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"に代入されます。