第7回 Python座学 リストでデータ管理を楽にする

プログラミング

シーケンスとはデータが順番に並び、並んでいる順番で処理を行うことを指します
str型オブジェクトは、ひとつひとつの文字が順番に並ぶことで意味を成すのでシーケンスです
str型オブジェクトとは別に、Pythonでは基本的なシーケンス型として
「リスト」「タプル」「range」の3つのオブジェクトがあり、これらのオブジェクトは
「1つのオブジェクトに複数のデータ」を収納できるので特徴です

  • リストとタプルは、オブジェクトの中に複数のオブジェクトを収納し「収納した順番で」オブジェクトを管理できます
  • リスト・・・一度セットした値を何度でも書き換えが可能
  • タプル・・・一度セットした値は書き換えが不可
    変えてはいけない値を維持するために使用

1行目が「リスト」になります
変数 = [‘○○’,’××’]の形でできます
また、文字ではなく数字を混ぜても収納可能です

インデックシング

リスト内の順序は維持されているので、リストの何番目にあるかを表すインデックスを[]で囲み指定することで、各要素にアクセスすることが可能です
インデックス=シーケンス番号は、0から始まる要素の順番を表す数値で、
一番最初にある要素は0、2番目にある要素は1で呼び出せます

また[]内の数値を-1、-2と入力すると、リストの最後の要素から出力することができます
これをネガティブインデックスと呼びます
その場合、0は使用しません

スライス

インデックスを2つ以上指定することで、特定の要素を参照することをスライスと言います
スライスされた要素もリストとして出力されます

基本はインデックシングと同じです
ただし、末尾から参照することもできますが注意点があります

1行目は呼び出しが成功していますが2行目は失敗しています
末尾から遠いインデックスから指定する必要があるので注意しましょう
スライスには他にも何パターンかあります

連続してスライス
末尾から連続でスライス
1つおきにスライス
末尾から一つおきにスライス

インテレーション

リストの処理でよく使われるものとして、

すべての要素に、順番に、何かの処理をするインテレーションというものがあります
インテレート繰り返し処理をするという意味で、オブジェクトから順番に値を取り出すことを意味します

この画像の場合はrangeがインテレーションに該当します

リストにはオブジェクトが含まれているので、インテレート可能なオブジェクトです
[]内の要素を順番に1つずつ取り出し、変数attackに収納されます
forブロック内で変数を指定すれば、すべての変数に対して順番に処理が行われます

上の図の場合、

  • 2行目…処理を3回繰り返す
  • 3行目…attacksのリスト内の要素を順番に出力する
  • 4行目…attackに収納されている要素を改行せずに出力する
  • 5行目…外側のforの処理の最後に改行を入力

外側のforの処理による3回のループ内でattacksのリスト内の要素をattackに取り出して、attackを出力しています
print関数は最後に改行を出力しますが「end=””」を()内に入力しておくと、改行ではなくスペースを出力するので、結果として改行されないようになります

リストを更新する

Pythonのリストは要素の内容を変更したり、別のオブジェクトに変更できます
これを「ミュータブル」と言います

攻撃の番号である0を指定して、内容を強攻撃に変更しました

リストはlist型の立派なオブジェクトなので、ミュータブルなシーケンス用のビルトインメソッドが使用可能です
よく使用されるのは末尾に要素を追加できるppend()と、任意の場所の要素を取り出しそれを出力するpop()です

末尾に「アイテム」を追加できました

末尾のオブジェクトを取り出しました
取り出した後のリストには「アイテム」は残りません

2つのリストをforで処理する

リストを使うことで複数のオブジェクトを集中管理できるようになります

このようにリストを2つ用意すれば、攻撃側と防御側それぞれで行動パターンを用意することができます

タプル

  • min・・・min()関数と言われ、2つ以上の引数の中で最小のものを返すビルトイン関数
  • len関数・・・オブジェクトの要素の数を返す、ビルトイン関数
  • (len(attacker)・・・attackerの要素数を取得する
  • (len(others)・・・othersの要素数を取得する
  • sep・・・print関数の引数で区切りを設定する

一度入力した要素を変更できないイミュータブル(不変)なリストをタプルと言います

結果は同じですが、1行目の[]を()に変更、もしくは入力しないことで書き換えが不可能となり

  • 書き換えられることがないのでコードの解釈が早くなり、パフォーマンスの点で有利になる
  • 値を誤って書き換える危険がない
  • 関数やメソッドの引数はタプルとして渡されている

書き換えが必要になる場合には新しく値を設定する必要があります