Lists - Learn Python 3 - Snakify

Lesson 7
リスト


1. リスト

プログラムのほとんどは変数だけでなく、また、変数のリストも使用します。例えば、プログラムは、キーボードまたはファイルから生徒のリストを読むことによって、クラス内の生徒に関する情報を扱うことができます。クラス内の学生数の変更では、プログラムのソースコードを変更する必要はありません。

これまで、シーケンスの要素を処理する場合など、すでにシーケンス要素の処理に直面していました。しかし、私たちは全シーケンスをコンピューターの記憶に残していません。しかし、多くの問題では、シーケンスのすべての要素を昇順(「シーケンスをソート」)に出力する必要があるかのように、シーケンス全体を保持する必要があります。

このようなデータを格納するには、Pythonではlistというデータ構造を使用できます(ほとんどのプログラミング言語では、異なる用語、「配列」が使用されています)。リストは、文字列の文字と同じように、0から番号付けされた要素のシーケンスです。リストは、以下のように、リストを角括弧で囲んで要素を列挙して手動で設定できます。

Primes = [2, 3, 5, 7, 11, 13]
Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']

リストPrimesは、 Primes[0] == 2Primes[1] == 3Primes[2] == 5Primes[3] == 7Primes[4] == 11Primes[5] == 13 。リストRainbowは7つの要素があり、それぞれが文字列です。

文字列内の文字と同様に、リスト要素は負のインデックスを持つこともできます。たとえば、 Primes[-1] == 13Primes[-6] == 2です。負のインデックスは、最後の要素から始まり、リストを読むときに左に行くことを意味します。

関数lenリストの長さを意味する)を持つリストの要素数を得ることができます。たとえば、 len(Primes) == 6です。

文字列とは異なり、リストの要素は変更可能です。新しい値を割り当てることで変更できます。

1
2
3
4
5
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])
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

リストを作成したり読むためのいくつかの方法を考えてみましょう。まず、空のリスト(アイテムのないリスト、その長さは0)を作成し、 appendを使用してリストの末尾にアイテムを追加することができappend 。例えば、プログラムがリストn要素の数を受け取った後、リストのn n要素を別々の行で1つずつ受け取ったとします。この形式の入力データの例を次に示します。

5
1809
1854
1860
1891
1925
この場合、次のようなリストから読み上げを構成することができます。
1
2
3
4
5
6
7
8
a = [] 
n = int(input()) 
for i in range(n)
    new_element = int(input()) 
    a.append(new_element) 
    21
    # a.appendintinput
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

実例では、空のリストが作成され、要素の数が読み取られた後、リスト項目を1行ずつ読み込んで最後に追加します。変数n保存して同じことができます:

1
2
3
4
a = []
for i in range(int(input())):
    a.append(int(input()))
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

リストには複数の操作が定義されています。リストの連結(リストの追加、つまり1つのリストを別のリストに貼り付ける)と繰返し(リストを番号で掛ける)です。例えば:

1
2
3
4
5
6
a = [123]
b = [45]
c = a + b
d = b * 3
print([78] + [9])
print([01] * 3)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

結果のリスト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番目の要素リストの

1
2
3
a = [0] * int(input())
for i in range(len(a)):
    a[i] = int(input())
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

リストa要素をprint(a)print(a)することができます。これは、角括弧で囲まれカンマで区切られたリスト項目を表示します。一般に、これは不便です。一般的に、すべての要素を1行または1行に1つずつ印刷しようとしています。これには、他の形式のループを使用した2つの例があります。

1
2
3
a = [12345]
for i in range(len(a)):
    print(a[i])
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ここでは、インデックスiが変更され、要素a[i]が表示されます。

1
2
3
a = [12345]
for elem in a:
    print(elemend=' ')
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

この例では、リスト項目は空白で区切られた1行で表示され、変更されるインデックスではなく、変数自体の値です(たとえば、 for elem in ['red', 'green', 'blue']変数elem'red''green''blue'連続して取ります。

最後の例に特に注意してください! Pythonイデオロギーの非常に重要な部分はforループです。これは、シーケンスのすべての要素を反復処理する便利な方法を提供します。これは、PythonがPascalと異なるところです。ここでは、要素のインデックスを反復処理する必要がありますが、要素自体は処理しません。

Pythonのシーケンスは、文字列、リスト、関数range()値(リストではありません)、その他のオブジェクトです。

ここでは、文字列からすべての数字を抽出し、数値リストを作成する必要があるときにforループを使用する例を示します。

1
2
3
4
5
6
7
8
9
10
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)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

2. 分割および結合メソッド

リスト項目は、文字で区切られた1行で指定できます。この場合、リスト全体をinput()を使用して読み取ることができます。最初の文字列を空白で切り取った結果の文字列のリストを返す文字列メソッドsplit()使用できます。例:

1
2
3
4
5
# 1 2 3
s = input() # s == '1 2 3'
a = s.split() # a == ['1' '2' '3']
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

このプログラムを1 2 3入力データで実行aと、リストa['1', '2', '3']等しくなります。リストは数字ではなく文字列で構成されます。数字のリストを取得する場合は、リスト項目を1つずつ整数に変換する必要があります。

1
2
3
4
a = input().split()
for i in range(len(a)):
    a[i] = int(a[i])
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Pythonの特別な魔法を使う - ジェネレータ - 同じことを1行で行うことができます:

1
2
a = [int(s) for s in input().split()]
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

(このコードは次のセクションでどのように動作するかについて説明します。)実数のリストを読みたい場合は、型intfloatに変更する必要があります。

メソッドsplit()は、リスト項目間のセパレータとして使用される文字列を決定するオプションのパラメータがあります。たとえば、 split('.')メソッドを呼び出すと、最初の文字列を分割して得られたリストが返されます'.'遭遇した:

1
2
a = '192.168.0.1'.split('.')
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Pythonでは、1行のコマンドを使って文字列のリストを表示することができます。そのために、メソッドjoinが使用されます。このメソッドには、文字列のリストという1つのパラメータがあります。与えられた要素を連結して得られた文字列を返し、リストの要素の間に区切り記号を挿入します。このセパレータは適用されるメソッドの文字列と同じです。私たちはあなたが最初の文章を理解できなかったことを知っています。 :)例を見てください:

1
2
3
4
5
6
7
a = ['red''green''blue']
print(' '.join(a))
print(''.join(a))
redgreenblue
print('***'.join(a))
***
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

リストが数字で構成されている場合は、ダークマジックのジェネレータを使用する必要があります。リストの要素をスペースで区切って出力する方法は次のとおりです。

1
2
3
4
5
a = [123]
print(' '.join([str(i) for i in a]))
# joinstrs
# print '' .joina
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

しかし、ダークマジックのファンでなければ、 forループfor使って同じ効果を達成することができます。

3. 発電機

同じ項目で満たされたリストを作成するには、リストの繰り返しを使用します。たとえば、次のようにします。

1
2
3
n = 5
a = [0] * n
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

より複雑なリストを作成するには、 ジェネレータを使用できます。式は、数式に従ってリストを埋めることを可能にします。ジェネレータの一般的な形式は次のとおりです。

[expression for variable in sequence]

ここで、 variable 、いくつかの変数のIDされるsequence変数をとる値のシーケンス(これはリスト、文字列、または関数用いて得られたオブジェクトであることができるあるrange )、 expression通常変数に応じて、いくつかの表現-ジェネレータで使用されます。リスト要素はこの式に従って埋められます。

ジェネレータを使用する人々の例をいくつか紹介します。

これは、ジェネレータを使用してnゼロのリストを作成する方法です。

1
2
a = [0 for i in range(5)]
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

整数の四角で埋められたリストを作成する方法は次のとおりです。

1
2
3
n = 5
a = [i ** 2 for i in range(n)]
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

1からnまでの数の正方形のリストを記入する必要がある場合は、 rangeの設定をrange(1, n + 1)変更できます。

1
2
3
n = 5
a = [i ** 2 for i in range(1n + 1)]
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

1から9までの乱数で満たされたリストを得る方法は次のrandrange (モジュールrandomからのrandrangeを使用)。

1
2
3
4
from random import randrange
n = 10
a = [randrange(110) for i in range(n)]
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

この例では、リストは標準入力から読み込まれた行から構成されます:リストの要素の数を入力する必要があります(この値は関数のrange引数として使用されrange )。

1
2
a = [input() for i in range(int(input()))]
print(a)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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]はステップkA[i]A[i+k]A[i+2*k] 、...で切断される。 k <0の場合、要素は逆の順序になります。

数字iまたはjそれぞれが欠落している可能性があり、「行頭」または「行末」を意味するものは、

文字列とは異なり、リストは変更可能なオブジェクトです 。リスト項目を新しい値に割り当てることができます。さらに、スライス全体を変更することも可能です。例えば:

1
2
3
A = [12345]
A[2:4] = [789]
print(A)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ここでリスト[1, 2, 3, 4, 5] 1、2、3、4、5]を受け取り、スライスA[2:4]つの要素を3つの要素の新しいリストに置き換えようとします。結果のリストは、 [1, 2, 7, 8, 9, 5]ます。

1
2
3
A = [1234567]
A[::-2] = [10203040]
print(A)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

そして、ここで、結果のリストは[40, 2, 30, 4, 20, 6, 10]ます。理由は、 A[::-2]は要素A[-1]A[-3]A[-5]A[-7]リストであり、 30,40である。

不連続なスライス(すなわち、ステップkk > 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の出現回数