見出し画像

pythonプログラム初歩の初歩4/リストの話

こんにちはmakokonです。
今日の初歩の初歩は、リストの話です。
pythonプログラムをするようになって、最も便利だと感じているのがリスト変数でした。
とても奥が深いのですが、とても浅い理解でもとても便利なのでその使い方を紹介します。


課題1 あなたの好きな都道府県を5つ入力し、1行に一つづつ出力しなさい。

課題があまりにくだらないのは申し訳ない。これの味も素っ気もないプログラムがこちら。

print("あなたの好きな都道府県を5つ教えて下さい")

a=input('1つ目は:')
b=input('2つ目は:')
c=input('3つ目は:')
d=input('4つ目は:')
e=input('5つ目は:')

print(a)
print(b)
print(c)
print(d)
print(e)

そして実行結果は、

あなたの好きな都道府県を5つ教えて下さい
1つ目は:東京都
2つ目は:神奈川県
3つ目は:大阪府
4つ目は:愛知県
5つ目は:埼玉県
東京都
神奈川県
大阪府
愛知県
埼玉県

たしかに正しいけど、input文とprint文の練習ですね。
とりあえず、おんなじ文を5回も回ていてはそれだけで間違えそう。

課題2 課題1のプログラムをリストとforループを使ってシンプルに纏める。

とりあえず、都道府県名に5つも別の変数を当てるのもだめなので直したのがこれ。

print("あなたの好きな都道府県を5つ教えて下さい")
# 空のリストを作成
prefectures = []
# 5回ループを回す
for i in range(5):
    # ユーザーに都道府県を入力してもらい、リストに追加
    prefecture = input(f'{i+1}つ目は:')
    prefectures.append(prefecture)
# 入力された都道府県を表示
for prefecture in prefectures:
    print(prefecture)
    

結果は同じです。
prefecturesというのが、今回のテーマのリストで、[]は空のリストです。
for in range(5) で5回ループし、毎回prefectureに入力し、
prefectures.append(prefecture)でリストに追加していきます。
出力するときは
for prefecture in prefectures: でリストから一つづつ順番にprefectureを取り出して、printします。
なお、print(prefectures)でリスト自身を表示するとこんな感じで、[]の中に、データがコンマで区切られて入っています。

print(prefectures)

['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県']

参考までにこれをCで書くとこんな感じ。(適当だけど)
最初に配列を必要な数だけ宣言しなきゃいけないし、入出力それぞれでインデックス管理がいるので、これだけで面倒ですね。

#include <stdio.h>

int main() {
    char prefectures[5][100];  // 5つの都道府県を保存するための文字列の配列を宣言します。

    printf("あなたの好きな都道府県を5つ教えて下さい\n");

    // 5回ループを回す
    for (int i = 0; i < 5; i++) {
        // ユーザーに都道府県を入力してもらい、配列に保存
        printf("%dつ目は:", i + 1);
        scanf("%s", prefectures[i]);
    }

    // 入力された都道府県を表示
    for (int i = 0; i < 5; i++) {
        printf("%s\n", prefectures[i]);
    }

    return 0;
}

簡単極まりないプログラムだったけど、この作りやすさに感動しました。

課題3 リストに対する基本的な操作

基本操作のあれこれ。課題はこれ。
要素の数、要素のランダムアクセス、要素の追加、要素の削除の練習

prefectures=['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県']に対し、以下の処理を順に適用してください。
・要素の数を表示してください。
・前から2番目の要素を表示してください。
・後ろから2番目の要素を表示してください。
・後ろに"千葉県"を追加して、リスト全体を表示してください。
・最初の要素を削除して、リスト全体を表示してください。
・最後の要素を削除して、リスト全体を表示してください。

プログラムと結果は、こんな感じ

# 初期のリストを定義します。
prefectures=['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県']
# 要素の数を表示します。
print(f"要素の数: {len(prefectures)}")
# 前から2番目の要素を表示します。
print(f"前から2番目の要素: {prefectures[1]}")
# 後ろから2番目の要素を表示します。
print(f"後ろから2番目の要素: {prefectures[-2]}")
# 後ろに"千葉県"を追加します。
prefectures.append('千葉県')
print(f"千葉県を追加したリスト: {prefectures}")
# 最初の要素を削除します。
del prefectures[0]
print(f"最初の要素を削除したリスト: {prefectures}")
# 最後の要素を削除します。
prefectures.pop()
print(f"最後の要素を削除したリスト: {prefectures}")
要素の数: 5
前から2番目の要素: 神奈川県
後ろから2番目の要素: 愛知県
千葉県を追加したリスト: ['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県', '千葉県']
最初の要素を削除したリスト: ['神奈川県', '大阪府', '愛知県', '埼玉県', '千葉県']
最後の要素を削除したリスト: ['神奈川県', '大阪府', '愛知県', '埼玉県']

なお、最後の要素の削除は
del prefectures[-1]とかでの削除できます。つまり、好きな場所を消せるのですが、最後に追加した要素を削除するという意味が伝わりやすいので、お好みですがpopを使うのがおすすめです。

課題4 リストの要素をインデックスとともに出力してください。


配列を使うと、何番目の要素であるかが重要なときがあります。例えば配列の中から奇数番目の要素を抜き出すとかありますよね。そんなことに関するテクニックを紹介します。

prefectures=['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県']
にたいして、インデックスとともに要素を1行に一つずつ表示し、その後、奇数番目の要素だけからなるリストを作って、そのリストを表示してください。リストの作り方を3種類考えなさい。

prefectures=['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県']

for i, prefecture in enumerate(prefectures):
    print(f"インデックス:{i}, 値:{prefecture}")
# 方法1 リストスライシング
odd_prefectures = prefectures[1::2]
print(odd_prefectures)
# 方法2 汎用的
odd_prefectures = []
for i, prefecture in enumerate(prefectures):
    if i % 2 != 0:
        odd_prefectures.append(prefecture)
print(odd_prefectures)
# 方法3 リスト内包表記
odd_prefectures = [prefecture for i, prefecture in enumerate(prefectures) if i % 2 != 0]
print(odd_prefectures)

実行結果はこちら

インデックス:0, 値:東京都
インデックス:1, 値:神奈川県
インデックス:2, 値:大阪府
インデックス:3, 値:愛知県
インデックス:4, 値:埼玉県
['神奈川県', '愛知県']
['神奈川県', '愛知県']
['神奈川県', '愛知県']


enumerate(prefectures)
enumerate(prefectures)関数は、リストからインデックスと要素のペア(タプルというらしい)を作ります。例えば場所を表す(緯度,軽度)とかもそうですね。分かちがたい組み合わせを表します。
したがって、
for i, prefecture in enumerate(prefectures):
によって、インデックスと要素をそれぞれ、iとprefectureに順番に代入されます。なお、インデックスは0から始まっています。5つの要素だと0−4のインデックスが使われますね。


リストスライシング

等間隔の要素を抜き出すのに適しています。
[start:stop:step]の形で評価され、startはスライスの開始位置、stopはスライスの終了位置、stepはスライスのステップ(間隔)を指定します。
stopを省略すると要素の最後までが指定されます。
したがって、prefectures[1::2]は、 
1番の要素から、最後の様さまでを2つおきにピックアップします。

汎用的な方法

odd_prefectures = []
for i, prefecture in enumerate(prefectures):
  if i % 2 != 0:
  odd_prefectures.append(prefecture)

最も汎用的な方法で、for文で得られたインデックスと、要素を順番に評価して、インデックスが奇数ならば新しいリストに追加します。こんな課題では大した意味はないですが、インデックスに対して複雑な判定処理を組み込むことができます。

リスト内包表記

odd_prefectures = [prefecture for i, prefecture in enumerate(prefectures) if i % 2 != 0]

かっこいい書き方ですね。元のリストから特定の条件を満たす要素を新しく生成して、新しいリストに追加する書きかたです。
基本形は
[新しい要素の形 for item in 元のリスト if 追加条件] となります。

つまり、
odd_prefectures = [prefecture for i, prefecture in enumerate(prefectures) if i % 2 != 0]
は、prefectureを要素とする新しいリストを作る、元のリストprefecturesからインデックスとprefetureを取り出して、そのインデックスが奇数だったら追加条件をみたすという意味になります。


課題5 特別な書式を持つ文字列からリストを作ってください。

課題1のときには都道府県名を5回に分けて入力しましたが、現実を考えると報告書やエクセルシートからデータをコピーしてくることが多いでしょう。つまり、スペースやコンマで区切られたデータ文字列が入力されるケースがほとんどです。つまり、こんな課題です。
s1="東京都 神奈川県 大阪府 愛知県 埼玉県"
s2="東京都,神奈川県,大阪府,愛知県,埼玉県"
文字列s1,s2から、それぞれ5語の要素のリストを作ってください。

s1="東京都 神奈川県 大阪府 愛知県 埼玉県"
s2="東京都,神奈川県,大阪府,愛知県,埼玉県"

# スペースで分割
list_s1 = s1.split()
# カンマで分割
list_s2 = s2.split(',')

print(list_s1)
print(list_s2)

結果は以下の通り


['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県']
['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県']

split()関数は、文字列を分割してリストにします。
list = str.split(区切り文字)のように使います。
区切り文字を省略したときの、デフォルトは空白的な文字(スペースやタブ、改行など)となります。明示的にスペースだけを区切り文字としたいときはsplit(' ')のように書きますが、改行(\n)やタブ(\t)がリストの要素になるのであんまり適した用途はないでしょう。
このように文字列は簡単にリストにできます。また、この方法は要素の数がいくつあるかわからなくても使えるので、とりあえずリストにしてしまえば数もわかるし、ランダムアクセスも簡単だしといいこといっぱいです。
なお、逆にリストを文字列にするには.join()を利用します。
コードだけ示しますね。

prefectures=['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県']

# スペースで連結
s1 = ' '.join(prefectures)
# コンマで連結
s2 = ','.join(prefectures)

print(s1)
print(s2)

LLMの処理など、文字列でやり取りしなくては行けないものはたくさんありますが、その内容はを色々編集したいことがあります。この場合、リストで条件を管理して、最後に連結して文字列にするとわかりやすいですね。

まとめ

今回はリストの非常に基本的な方法を示しました。
リストを使うことで、データの扱いが非常に楽になります。

  • たくさんの情報を一元化して扱うことができます。

  • 他の言語(例えばC言語)の配列と違って、あらかじめメモリを確保する必要もなく、要素の数を気にせず作成できます。

  • インデックスを使って、配列のようにランダムアクセスが可能です。

  • 要素の追加、削除が非常に簡単です。

  • リストから投句低条件の新しいリストを作る方法が沢山提供されています。

  • 要素を詰め込んだ、文字列が容易にリストに変換可能であり、とても扱いやすくなります。

  • 必要なら、リストから文字列に戻すこともできます。

今回は、本当の基礎的なリスト操作だけを紹介しました。これだけでもpythonが非常につい買いやすくなるのでぜひ試してください。

次回以降は、
リスト内の検索や、リスト同士の演算など複雑な操作がたくさんあります。
リストの要素は、文字列だけでなく、あらゆる変数タイプ、リストそのものも扱うことができます。

また、リストのように複数のデータを纏めて扱う形式もあります。よく使われるのは、タプル、辞書、セットです。

  • タプル(tuple): タプルはリストと同じく要素をまとめて扱うためのデータ型ですが、一度作成したタプルはその要素を変更することができません(イミュータブル)。

    1. my_tuple = ('apple', 'banana', 'cherry')

  • 辞書(dict): 辞書はキーと値のペアを要素とするデータ型で、キーを指定して値を取り出すことができます。

    1. my_dict = {'name': 'John', 'age': 30, 'city': 'New York'}

  • セット(set): セットは重複する要素を持たないリストのようなデータ型で、集合演算(和集合、積集合、差集合など)を行うことができます。

    1. my_set = {1, 2, 3, 4, 5}

これらのデータ型はそれぞれ特有の性質と使い方があるため、目的に応じて適切なデータ型を選択することが大切です。また、これらのデータ型はリストと同様に、forループやリスト内包表記、スライスなどを使って操作することができます。
これも、機会があれば説明したい音もいます。と訓示辞書は、AIの世界では圧倒的に使用頻度が高いです。

おまけ タイトル画の説明 by GPT-4V


このカラフルなアニメ風の画像には、太陽のキャラクターと、コンピューターに向かって作業をしている男の子が描かれています。太陽は人間の特徴を持ち、大きなサングラスをかけて右手を上げています。男の子はホワイトシャツにオレンジ色のネクタイをしており、キーボードでタイピングしながら太陽に向かって笑顔で手を振っています。デスクにはリンゴやトマトなどの果物が置かれており、モニターにはコードのようなテキストが表示されています。画像の全体的な雰囲気は楽しく、明るく、教育的なコンテンツを思わせるものです。

#python #programing #リスト #インデックス #リストからリスト #リストから文字列 #文字列からリスト #スライス #リスト内包表記 #for文


いいなと思ったら応援しよう!