⚠️ 記事内に広告を含みます。

pythonでfor構文をつかって繰り返し処理をする方法 dict, list, JSON, csv range

for構文をつかって繰り返し処理を行う方法

for文を使うと繰り返し処理ができます。

forの基礎

forは1~100までの範囲で繰り返し処理するなどに使えます。

forの基本は1~100まで変化する変数iを決めて、その下でiに1ずつ増やして処理します。

for {変数} in “変数の変域” :
繰り返し処理(変数)

変数の変域の部分にはイテラブル(繰り返せる)なオブジェクトを指定する必要があります。
イテラブルな要素は以下です。

  • タプル
  • リスト
  • range()
  • 辞書 dict
  • JSON

言葉よりも実例を見たほうが理解しやすいです。

タプルを利用する

タプルは複数の値が並んでいるデータ型の一つで、見た目もシンプルです。

for i in 1,2,3,4,5:
    print(i)
---実行結果---
1
2
3
4
5

タプルはかっこが付きで書いたほうがコードが読みやすいと思います。
どっちでも実行結果はおなじです。

for i in (1,2,3,4,5):
    print(i)

タプルでもint型のように合計できる

sum = 0
for i in (1,2,3,4,5):
    sum += i
print(sum)
---実行結果---
15

タプルは後述のリストとは違ってタプルの内容を後から追加したり、削除はできない。(タプルの内容を書き換える場合はリスト変換→更新→タプルに変換、と面倒)基本はリストを使えばよいが、パフォーマンス(微微)、hashableな値として利用ではタプルを利用

リストを利用する

変数の変域にリストを使ったシンプルな方法です。

for i in [1,2,3,4,5]:
    print(i)

---実行結果---
1
2
3
4
5

リストは別で変数に入れても良いです

list = [1,2,3,4,5]

for i in list:
    print(i)    # 1 2 3 4 5 が改行して表示される

文字もOK

list = ["ume","sakura","matsu","botan"]

for i in list:
    print(i)   

---実行結果---
ume
sakura
matsu
botan

range()を使う

1~10くらいなら良いですが、1~100となるとリストに文字を打つのが大変です。そんなときはrange()を使います。

range(開始数,終了数)です。終了数は含まれないので注意

for i in range(1,5):
    print(i)
---実行結果---
1
2
3
4

5を含みたい場合はrange(1,6)とする

range(5)と書くと初期値は0でrange(0,5)と同じ意味になります。

for i in range(5):
    print(i)
---実行結果---
0
1
2
3
4

ちなみにfor文では変数を含まない処理を書いてもよく、繰り返し数(ここでは5回)だけ処理が繰り返し実行されます。

for b in range(5):
    print("hello")
---実行結果---
hello
hello
hello
hello
hello

・タプル型でも同じ
for i in (5,4):
    print("Yes")
---実行結果---
Yes
yes

ユーザ入力を使ったプログラム

rangeでは範囲に変数を書くことで、ユーザが入力した数まで増分1の数字を出力するプログラムを作れます。

num = int(input("Enter a number: "))

for i in range(1,num):
    print(i)

---実行結果---
Enter a number:5
1
2
3
4

num input(“Enter a number: “)では入力がint型ではないのでエラーになります。

rangeでは20ずつ増加など、増分を調整できます。

for i in range(1,100,20):
    print(i)
---実行結果---
1
21
41
61
81

当然減らす方向でもOK

for i in range(5,0,-1):
    print(i)
----実行結果---
5
4
3
2
1

辞書型(dict)を利用する

dict型はキーと値(バリュー)の2ペアになっている形式のデータです。

dict_list = {'a': 1, 'b': 2, 'c': 3}
キーa: 値が1
キーb: 値が2
キーc: 値が3

dictもイテラブルなのでforで繰り返し実行できます。dictをforでそのまま実行するとキーが出てきます。

dict_list = {'a': 1, 'b': 2, 'c': 3}
for i in  dict_list:
    print(i)
----実行結果---
a
b
c

dictに対して、.keys()と書くと明示的にキーを取得できる(結果は同じ)
#辞書のキーを取得する
dict_list = {'a': 1, 'b': 2, 'c': 3}
for d in dict_list.keys():
    print(d)
----実行結果---
a
b
c

dictのキーとバリュー両方, バリューのみ取得は以下の記述(.items, .valus)

# 辞書のキーと値を取得する
dict_list = {'a': 1, 'b': 2, 'c': 3}
for b in dict_list.items():
    print(b)
----実行結果---
('a', 1)
('b', 2)
('c', 3)

#辞書の値を取得する
dict_list = {'a': 1, 'b': 2, 'c': 3}
for c in dict_list.values():
    print(c)
----実行結果---
1
2
3

dictでもバリューの偶数のみ表示するなどの計算、判定ができる

dict_list = {'a': 1, 'b': 2, 'c': 3}

#辞書の値を取得する
for i in dict_list.values():
    #偶数のみ表示する
    if i % 2 == 0:
        print(i)
    else:
        print(f'{i}は奇数です。')
----実行結果---
1は奇数です。
2
3は奇数です。

JSONを利用する

JSONは様々な言語利用できるデータをやり取りするためのフォーマットです。データ型ではありませんが、よく利用されます。名前nameと年齢ageのJSONデータがあります。

json_list = [  {"name": "太郎", "age": 50},    {"name": "鷺頭", "age": 21},    {"name": "三宮", "age": 18} ]

このJSONの年齢の部分を取り出して、成人か未成年かを判定します。
このJSONはstr型なので、json.lodsを使ってリストに変換しています。
型の確認はtype()で確認できます。
繰り返し処理では年齢ageの値が20歳以上かを判定しています。

import json  #jsonモジュールをインポート

json_list = '[  {"name": "太郎", "age": 50},    {"name": "鷺頭", "age": 21},    {"name": "三宮", "age": 18} ]'

print(type(json_list)) # <class 'str'> str型であることを確認

json_list_data = json.loads(json_list) # json.loads()でjson形式の文字列をpythonのデータ型に変換
print(type(json_list_data)) # <class 'list'> list型に変換された

for i in json_list_data:
    print(i["age"]) # 50 21 18 年齢を表示
    if i["age"] >= 20:
        print(i["name"] + "は成人です。") # 成人者のみ表示
    else:
        print(i["name"] + "は未成年です。") # 未成年者のみ表示

---実行結果---
<class 'str'>
<class 'list'>

50
太郎は成人です。
21
鷺頭は成人です。
18
三宮は未成年です。

CSVを利用する

csvはカンマで区切られたデータで表計算ソフトで開くことができます。
csvを利用することもできます。

import csv # csvモジュールをインポート

csv_file = open('test3.csv', 'r')  #同じディレクトリにあるtest3.csvを開く
csv_reader = csv.DictReader(csv_file)  #csvファイルを辞書型に変換

print(type(csv_reader)) #型がdict型になっていることを確認


for row in csv_reader:   #csv_readerの中身をrowに代入
    print(row)  #rowの中身を表示
    
    #ageの値が20以上の場合、ageの値を表示
    if int(row['age']) >= 20:
        print(row['age']) #ageの値を表示
        #成人者の名前と年齢を表示
        print(f"{row['name']}は成人者です。年齢は{row['age']}歳です。")  #f-文字列を使って成人者の名前と年齢を表示
    else:
        print(f"{row['name']}は未成年者です。年齢は{row['age']}歳です。") # 未成年者の名前と年齢を表示

合計を計算する

forで入れた数字の合計を計算するということも可能です。
1~5までの和を計算。数学でいえば等差数列の和ですね(初項=1, 公差=1, 末項n=5)。


$$
\sum_{k=1}^{n}k \\
n=5, k=1の時\\
\sum_{k=1}^{5}k=\frac{n(n+1)}{2}=\frac{30}{2}=15
$$

num = 5  #numは範囲の最大値
sum = 0  #sumは合計値で初期値は0

for i in range(1,num+1):
    sum += i  #sumにiを足す処理を繰り返す
print(sum)

----実行結果---
15

和の公式から導いたものと同じになりました。プログラムで書くと簡単ですね。
足していく処理で重要なのは +=や-=です。これは指定したnを変数から加算、減算する意味があります。

  • sum += n → nをsumに足す
  • sum -= n →nをsumから引く

$$
\sum_{k=3}^{5}k=\sum_{k=1}^{5}k-\sum_{k=1}^{2}k=\frac{5・6}{2}-\frac{2・3}{2}=12
$$
この場合もプログラム上では簡単に計算できます。

num = 5  #numは範囲の最大値
sum = 0  #sumは合計値で初期値は0

for i in range(3,num+1):  #rangeの初期値をk=3なので3
    sum += i  #sumにiを足す処理を繰り返す
print(sum)
----実行結果---
12

リストにして返す

指定の数(num)までの偶数をリストにして返す

# 10までの偶数をリストにして返す
num = 10
even_list = []    #空のリスト[]を用意
for i in range(1, num + 1):  #+1で10を含む
    if i % 2 == 0:      #2で割ったあまりが0なら
        even_list.append(i)  #even_listにリスト追加していく
print(even_list)

----実行結果---
[2, 4, 6, 8, 10]

TypeError: ‘int’ object is not iterableがでる

TypeError: ‘int’ object is not iterable が出てくる場合があります。

num = 5
for i in num:
    print(i)
----実行結果---
TypeError: 'int' object is not iterable

これはnumに入っているのが5という繰り返せる数字ではないからです。5から幾つまでどうやって増やしたり減らしたらわからないのでエラーになります。

イテラブルなリストやタプル、range関数などを使って指定しましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です