Lesson 7
リスト
1. リスト
プログラムのほとんどは変数だけでなく、また、変数のリストも使用します。例えば、プログラムは、キーボードまたはファイルから生徒のリストを読むことによって、クラス内の生徒に関する情報を扱うことができます。クラス内の学生数の変更では、プログラムのソースコードを変更する必要はありません。
これまで、シーケンスの要素を処理する場合など、すでにシーケンス要素の処理に直面していました。しかし、私たちは全シーケンスをコンピューターの記憶に残していません。しかし、多くの問題では、シーケンスのすべての要素を昇順(「シーケンスをソート」)に出力する必要があるかのように、シーケンス全体を保持する必要があります。
このようなデータを格納するには、Pythonではlistというデータ構造を使用できます(ほとんどのプログラミング言語では、異なる用語、「配列」が使用されています)。リストは、文字列の文字と同じように、0から番号付けされた要素のシーケンスです。リストは、以下のように、リストを角括弧で囲んで要素を列挙して手動で設定できます。
Primes = [2, 3, 5, 7, 11, 13] Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
リストPrimes
は、 Primes[0] == 2
、 Primes[1] == 3
、 Primes[2] == 5
、 Primes[3] == 7
、 Primes[4] == 11
、 Primes[5] == 13
。リストRainbow
は7つの要素があり、それぞれが文字列です。
文字列内の文字と同様に、リスト要素は負のインデックスを持つこともできます。たとえば、 Primes[-1] == 13
、 Primes[-6] == 2
です。負のインデックスは、最後の要素から始まり、リストを読むときに左に行くことを意味します。
関数len
( リストの長さを意味する)を持つリストの要素数を得ることができます。たとえば、 len(Primes) == 6
です。
文字列とは異なり、リストの要素は変更可能です。新しい値を割り当てることで変更できます。
Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet'] print(Rainbow[0]) Rainbow[0] = 'red' print('Print the rainbow') for i in range(len(Rainbow)): print(Rainbow[i])
リストを作成したり読むためのいくつかの方法を考えてみましょう。まず、空のリスト(アイテムのないリスト、その長さは0)を作成し、 append
を使用してリストの末尾にアイテムを追加することができappend
。例えば、プログラムがリストn
要素の数を受け取った後、リストのn
n
要素を別々の行で1つずつ受け取ったとします。この形式の入力データの例を次に示します。
5 1809 1854 1860 1891 1925この場合、次のようなリストから読み上げを構成することができます。
a = [] # 空のリストを開始する n = int(input()) # リスト内の要素の数を読み込む for i in range(n): new_element = int(input()) # 次の要素を読む a.append(new_element) # リストに追加する # 最後の2行を1行に置き換えることができます: # a.append(int(input())) print(a)
実例では、空のリストが作成され、要素の数が読み取られた後、リスト項目を1行ずつ読み込んで最後に追加します。変数n
保存して同じことができます:
a = [] for i in range(int(input())): a.append(int(input())) print(a)
リストには複数の操作が定義されています。リストの連結(リストの追加、つまり1つのリストを別のリストに貼り付ける)と繰返し(リストを番号で掛ける)です。例えば:
a = [1, 2, 3] b = [4, 5] c = a + b d = b * 3 print([7, 8] + [9]) print([0, 1] * 3)
結果のリストc
は[1, 2, 3, 4, 5]
1,2,3,4,5 [1, 2, 3, 4, 5]
に等しく、 d
リストは[4, 5, 4, 5, 4, 5]
d
[1, 2, 3, 4, 5]
に等しくなります。これにより、リストを別々に読み込むプロセスを整理することができます。まず、リストのサイズを考え、目的の要素数からリストを作成し、変数i
を0から始まりループ内でi
番目の要素リストの
a = [0] * int(input()) for i in range(len(a)): a[i] = int(input())
リストa
要素をprint(a)
でprint(a)
することができます。これは、角括弧で囲まれカンマで区切られたリスト項目を表示します。一般に、これは不便です。一般的に、すべての要素を1行または1行に1つずつ印刷しようとしています。これには、他の形式のループを使用した2つの例があります。
a = [1, 2, 3, 4, 5] for i in range(len(a)): print(a[i])
ここでは、インデックスi
が変更され、要素a[i]
が表示されます。
a = [1, 2, 3, 4, 5] for elem in a: print(elem, end=' ')
この例では、リスト項目は空白で区切られた1行で表示され、変更されるインデックスではなく、変数自体の値です(たとえば、 for elem in ['red', 'green', 'blue']
変数elem
は'red'
、 'green'
、 'blue'
連続して取ります。
最後の例に特に注意してください! Pythonイデオロギーの非常に重要な部分はfor
ループです。これは、シーケンスのすべての要素を反復処理する便利な方法を提供します。これは、PythonがPascalと異なるところです。ここでは、要素のインデックスを反復処理する必要がありますが、要素自体は処理しません。
Pythonのシーケンスは、文字列、リスト、関数range()
値(リストではありません)、その他のオブジェクトです。
ここでは、文字列からすべての数字を抽出し、数値リストを作成する必要があるときにfor
ループを使用する例を示します。
# 与えられた:s = 'ab12c59p7dq' # あなたはリストから数字を抽出する必要があります # そうするために: # 数字== [1,2,5,9,7] s = 'ab12c59p7dq' digits = [] for symbol in s: if '1234567890'.find(symbol) != -1: digits.append(int(symbol)) print(digits)
2. 分割および結合メソッド
リスト項目は、文字で区切られた1行で指定できます。この場合、リスト全体をinput()
を使用して読み取ることができます。最初の文字列を空白で切り取った結果の文字列のリストを返す文字列メソッドsplit()
使用できます。例:
# 入力は文字列です # 1 2 3 s = input() # s == '1 2 3' a = s.split() # a == ['1'、 '2'、 '3'] print(a)
このプログラムを1 2 3
入力データで実行a
と、リストa
は['1', '2', '3']
等しくなります。リストは数字ではなく文字列で構成されます。数字のリストを取得する場合は、リスト項目を1つずつ整数に変換する必要があります。
a = input().split() for i in range(len(a)): a[i] = int(a[i]) print(a)
Pythonの特別な魔法を使う - ジェネレータ - 同じことを1行で行うことができます:
a = [int(s) for s in input().split()] print(a)
(このコードは次のセクションでどのように動作するかについて説明します。)実数のリストを読みたい場合は、型int
をfloat
に変更する必要があります。
メソッドsplit()
は、リスト項目間のセパレータとして使用される文字列を決定するオプションのパラメータがあります。たとえば、 split('.')
メソッドを呼び出すと、最初の文字列を分割して得られたリストが返されます'.'
遭遇した:
a = '192.168.0.1'.split('.') print(a)
Pythonでは、1行のコマンドを使って文字列のリストを表示することができます。そのために、メソッドjoin
が使用されます。このメソッドには、文字列のリストという1つのパラメータがあります。与えられた要素を連結して得られた文字列を返し、リストの要素の間に区切り記号を挿入します。このセパレータは適用されるメソッドの文字列と同じです。私たちはあなたが最初の文章を理解できなかったことを知っています。 :)例を見てください:
a = ['red', 'green', 'blue'] print(' '.join(a)) # 赤い緑の青を返す print(''.join(a)) # 返信redgreenblue print('***'.join(a)) # 赤を返します。***緑を返します。
リストが数字で構成されている場合は、ダークマジックのジェネレータを使用する必要があります。リストの要素をスペースで区切って出力する方法は次のとおりです。
a = [1, 2, 3] print(' '.join([str(i) for i in a])) # 次の行は型エラーを引き起こし、 # join()はstrsのみを連結することができるため # print( '' .join(a))
しかし、ダークマジックのファンでなければ、 for
ループfor
使って同じ効果を達成することができます。
3. 発電機
同じ項目で満たされたリストを作成するには、リストの繰り返しを使用します。たとえば、次のようにします。
n = 5 a = [0] * n print(a)
より複雑なリストを作成するには、 ジェネレータを使用できます。式は、数式に従ってリストを埋めることを可能にします。ジェネレータの一般的な形式は次のとおりです。
[expression for variable in sequence]
ここで、 variable
、いくつかの変数のIDされるsequence
変数をとる値のシーケンス(これはリスト、文字列、または関数用いて得られたオブジェクトであることができるあるrange
)、 expression
通常変数に応じて、いくつかの表現-ジェネレータで使用されます。リスト要素はこの式に従って埋められます。
ジェネレータを使用する人々の例をいくつか紹介します。
これは、ジェネレータを使用してn
ゼロのリストを作成する方法です。
a = [0 for i in range(5)] print(a)
整数の四角で埋められたリストを作成する方法は次のとおりです。
n = 5 a = [i ** 2 for i in range(n)] print(a)
1からn
までの数の正方形のリストを記入する必要がある場合は、 range
の設定をrange(1, n + 1)
変更できます。
n = 5 a = [i ** 2 for i in range(1, n + 1)] print(a)
1から9までの乱数で満たされたリストを得る方法は次のrandrange
(モジュールrandom
からのrandrange
を使用)。
from random import randrange n = 10 a = [randrange(1, 10) for i in range(n)] print(a)
この例では、リストは標準入力から読み込まれた行から構成されます:リストの要素の数を入力する必要があります(この値は関数のrange
引数として使用されrange
)。
a = [input() for i in range(int(input()))] print(a)
4. スライス
リストや文字列では、スライスを行うことができます。すなわち:
A[i:j]
スライスji
要素A[i]
、 A[i+1]
、...、 A[j-1]
。
A[i:j:-1]
スライスij
要素A[i]
、 A[i-1]
、...、 A[j+1]
すなわち、要素の順序を変更しています)。
A[i:j:k]
はステップk
: A[i]
、 A[i+k]
、 A[i+2*k]
、...で切断される。 k
<0の場合、要素は逆の順序になります。
数字i
またはj
それぞれが欠落している可能性があり、「行頭」または「行末」を意味するものは、
文字列とは異なり、リストは変更可能なオブジェクトです 。リスト項目を新しい値に割り当てることができます。さらに、スライス全体を変更することも可能です。例えば:
A = [1, 2, 3, 4, 5] A[2:4] = [7, 8, 9] print(A)
ここでリスト[1, 2, 3, 4, 5]
1、2、3、4、5]を受け取り、スライスA[2:4]
つの要素を3つの要素の新しいリストに置き換えようとします。結果のリストは、 [1, 2, 7, 8, 9, 5]
ます。
A = [1, 2, 3, 4, 5, 6, 7] A[::-2] = [10, 20, 30, 40] print(A)
そして、ここで、結果のリストは[40, 2, 30, 4, 20, 6, 10]
ます。理由は、 A[::-2]
は要素A[-1]
、 A[-3]
、 A[-5]
、 A[-7]
リストであり、 30,40である。
不連続なスライス(すなわち、ステップk
、 k > 1
スライス)に新しい値が割り当てられると、古いスライスと新しいスライスの要素の数が必ず一致し、そうでない場合、エラーValueError
が発生します。
A[i]
はリストアイテムであり、スライスではありません。
5. リストの操作
リストを使って多くの異なる操作を簡単に行うことができます。
Aのx | リスト内の項目があるかどうかを確認します。 TrueまたはFalseを返します。 |
xはAではない | 同じではない(x in A) |
min(A) | リストの最小要素 |
max(A) | リストの中の最大の要素 |
A.index(x) | リスト内の要素xの最初の出現のインデックス。その不在時に例外ValueErrorを生成する |
A.count(x) | リスト内の要素xの出現回数 |