文字列・リスト
Back to index page
繰り返す回数が決まっている場合には for 文が便利です.for 文の基本形は以下のようなものです.
for i in range(a, b):
do something
|
for の次に繰り返しの回数に関与する変数を提示し,in 関数でその中に含まれる条件のときに文を実行します.in 関数は次の range 関数を参照します.range 関数は最初の数以上で2番目の数未満の整数を順に返します.実際に例を見た方が速いので,そちらを見てみましょう.
for i in range(1, 11):
print(i, end = ' ')
else:
print()
|
実行結果は以下のようになります.
1 2 3 4 5 6 7 8 9 10 |
もうちょっとひねりを入れたものも見てみましょう.2桁の正の整数を乱数により2つ発生させ,その小さい方の数から大きい方の数まで表示するものです.
from random import randint
small = randint(10, 99)
large = randint(10, 99)
if small > large:
small, large = large, small
print(f'Integers from {small} to {large}: ', end = '')
for i in range(small, large + 1):
print(i, end = ' ')
else:
print()
|
| Integers from 29 to 49: 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
演習
56 67 16 38 67 16 51 67 66 83 The sum of above numbers: 527 |
考え方
合計を入れておく変数を初期値 0 で定義する 乱数を発生させ,画面に表示する 乱数の値を合計の変数に += で追加する 上の処理を10回繰り返す |
22 18 85 51 17 84 46 89 73 40 The maximum and minimum of above numbers: 89, 17 |
考え方
最大値を入れておく変数を初期値 0 で定義する(10未満の数なら何でもよい) 最小値を入れておく変数を初期値 100 で定義する(100以上の数なら何でもよい) 乱数を発生させ,画面に表示する 乱数の値が最大値よりも大きかったら乱数の値を新たに最大値とする 乱数の値が最小値よりも小さかったら乱数の値を新たに最小値とする 上の処理を10回繰り返す |
11月19日のテキストで文字列を値として持つ変数の例を紹介しました.例えば,以下のようなものです.
strg = '123' |
文字列はその中に含まれる各文字にインデックス(指数)を利用してアクセスできます.例えば,上の文字列 strg の3文字目だけを表示させるプログラムは以下のようになります.
strg = '123' print(strg[2]) |
3 |
インデックスは 0 から始まることに注意してください.変数 strg のインデックスと要素の関係は以下のようになっています.
| インデックス | 値 |
|---|---|
| 0 | '1' |
| 1 | '2' |
| 2 | '3' |
文字列は複数の値を一つの名前でまとめたオブジェクトで,この後学習する配列の一形態です.複数の値を持っているということで,それらの値の並べ替えや削除が可能です.
strg = 'shimane'
print(''.join(sorted(strg)))
print(strg.strip('e'))
print(strg.replace('s', 'S'))
|
実行すると結果は以下のようになります.
aehimns shiman Shimane |

演習問題
Random number with 4 digits: 1582 Sorted: 1258, Reversed: 8521 |
手順: 数値の文字列化は str 関数を使用 str(num) 逆順の sort は引数に reverse = True を追加 sorted(strg, reverse = True) |
すべてのプログラミング言語には複数の値を一つの名前で扱える仕組みがあり,通常配列(array)と呼ばれています.Python では配列に関係するオブジェクトが複数あり,その一つがリスト(list)です.前項で扱った文字列はリストの一つです.
リストの性質としては以下のようなものがあります.
何番目の要素というように指定できる
何番目から何番目まで,のように指定できる
リストは [ ] の中に要素をカンマで区切って並べます.数値(int 型も float 型も)そのまま記述するだけですが,文字列は引用符 ' ' で囲います.値だけでなく変数なども要素に入れられますし,リストも要素にできます.要素の型が混在していても問題ありません.
num_lst = [2, 3, 5, 7, 11] str_lst = ['Gu', 'Choki', 'Pa'] num = 13 num_lst2 = [2, 3, 5, 7, 11, num] sub_lst = [17, 19, 23] num_lst3 = [2, 3, 5, 7, 11, num, sub_lst] mix_lst = [1, 'a', 2, 'bc', 3] print(num_lst) print(str_lst) print(num_lst2) print(num_lst3) print(mix_lst) |
[2, 3, 5, 7, 11] ['Gu', 'Choki', 'Pa'] [2, 3, 5, 7, 11, 13] [2, 3, 5, 7, 11, 13, [17, 19, 23]] [1, 'a', 2, 'bc', 3] |
上のプログラムを少し変更して特定の要素だけを表示させてみましょう.
num_lst = [2, 3, 5, 7, 11] str_lst = ['Gu', 'Choki', 'Pa'] num = 13 num_lst2 = [2, 3, 5, 7, 11, num] sub_lst = [17, 19, 23] num_lst3 = [2, 3, 5, 7, 11, num, sub_lst] mix_lst = [1, 'a', 2, 'bc', 3] print(num_lst[0]) print(str_lst[1]) print(num_lst2[2]) print(num_lst3[6][1]) print(mix_lst[1:3]) |
2 Choki 5 19 ['a', 2] |
リストの中にリストが入ると,インデックスが2次元になります.下から2つ目の print 文にある [6][1] というインデックスは sub_lst の 1 番目ということで 19 になります.また,最後のコロンで区切っているのはスライスで,1 番目から 2 番目までを表示させます.
リストについてインデックス順に操作することで反復処理によりリストを作ることができます.方法は,一つは一度空のリストを作っておいて要素を追加するものと,内包表記という方法があります.
from random import randint
lst = [None] * 5
print(lst)
for i in range(0, 5):
lst[i] = randint(10, 99)
print(lst)
|
[None, None, None, None, None] [99, 48, 79, 68, 45] |
None は何もないことを意味する定数で,値は無く要素が入る場所だけ確保する動作になります.
内包表記はちょっと難しい概念ですが,慣れると便利な機能です.
from random import randint lst = [randint(10, 99) for _ in range(5)] print(lst) |
[47, 70, 56, 15, 28] |
リストの中に for 文が入っています.また,for の次に下線文字 _ が来ていますが,わざわざ変数を定義しなくても range 関数は引数 5 に対して 0, 1, 2, 3, 4 を作るので,それがそのまま使用されるということです.
リストのような一つにまとまった値を個々の要素に分けることをアンパックと言います.リストの名前の前にアスタリスク * をつけることで要素をバラバラにできます.print 関数の引数に使用すると,一つ一つの値をスペースで分けて表示します.
from random import randint lst = [randint(10, 99) for _ in range(5)] print(*lst) |
29 79 76 36 55 |
演習問題
|
2 random numbers with 2 digits: 48, 96 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
Python にはリスト以外にいくつか配列がありますが,タプルという面白い構造があります.リストと違うのは要素の変更ができないこと(イミュータブル)ですが,それによりリストよりも動作が高速になります.変更する必要が無い要素の列を扱う場合にはタプルの使用が推奨されています.
前回の月別の日数の問題などはタプルを使用すると in 関数と組み合わせて以下のようにより簡単になります.
from random import randint
month = randint(1, 12)
print(f'Month: {month}')
if month == 2:
print('Days: 28')
elif month in (4, 6, 9, 11):
print('Days: 30')
else:
print('Days: 31')
|
Month: 9 Days: 30 |