おぼえがき

過ちては則ち改むるにうんぬんかんぬん

リスト(配列)について(Python)

f:id:feci:20210726231508j:plain

Python3

 

Python3.8.5でのリスト(配列)について。

#①ふつうにリストの作成
l = [43528'ハイ']  #リスト型の作成

for i in l:
  print(i)                      #4\n3\n5\n2\n8\nハイ

print(l[0],l[1],l[2],l[3])      #4 3 5 2(インデックスに紐付いた値を選択)
print(l[-1],l[-2],l[-3],l[-4])  #ハイ 8 2 5 3(-のインデックスは逆から選択)
print(l[0:5])                   #[4,3,5,2,8](インデックス0~5の値を指定)
print(l[:5])                    #[4,3,5,2,8](0は省略できる)
print(l[3:])                    #[2,3,'ハイ'](末尾の指定なしで最後まで選択)
print(l[:])                     #[4,3,5,2,8,'ハイ'](全選択)
print(l[::2])                   #[4,5,8](インデックス0表示後から1つ飛ばし)
print(l[::3])                   #[4,2](インデックス0表示後から2つ飛ばし)
print(l[::-1])                  #['ハイ',8,2,5,3,4](末尾から順に全選択)

print(len(l))                   #6(変数lには6つの値が入っている)
print(type(l))                  #<class 'list'>(変数lはlist型である)


#②list関数でリストの作成
l1 = list('abcde')              #list関数を使った文字列のリスト化
l2 = list(12345               #TypeError
l3 = list(1, 2, 3, 4, 5)        #TypeError
l4 = list('12345')              #

print(l1[:])                    #['a','b','c','d','e']
print(l4[:])                    #['1','2','3','4','5']


#③リストのネスト化
l5 = [123]
l6 = ['a''b''c']
l7 = [l5l6]                   #入れ子構造のリストの作成

print(l7[:])                    #[[1,2,3],['a','b','c']]
print(l7[0])                    #[1,2,3]
print(l7[1][0])                 #a(['a','b','c']のインデックス0だからa)

Pythonでは配列にはlist型とarray型の2種類があります。

 

ただまあ基本的にはPythonで配列といえばlist型です。

私がいまPythonを勉強してる酒井さんという人の講座でも、イテレータの説明はとっくに終わっていますがarrayはまだ出てきてすらいません。

 

リストはイテレータの一種です。

イテレータとは、「要素を1つずつ取り出せるオブジェクト」のようなもののことです。

リスト、タプル、辞書、集合などがイテレータに該当します。

 

 

リストを作るにはブラケット(角括弧)の中に値を1つずつカンマで区切って記述します。

そうすると先頭の値から順にインデックス0++を割り振られたリストが完成します。

 

またリストは、list関数を使うことでも作成可能です。

しかしこの方法では、int型の値を配列化することはできません。

いやもしかしたらできるのかもしれませんが、自分が調べたり試行錯誤した限りでは、str型の半角数字をint型にする方法は見つかりませんでした。

 

 

またリストはネスト化することも可能です。

ネストとは入れ子構造のことですね。

つまりリストの中にリストを入れる多次元配列です。

 

多次元配列化されたリストの値を取り出す方法は、上記③のスクリプトを参考にしてください。

 

 

リスト作成の定形は以下のとおりです。

 

変数名 = [値1, 値2, 値3, ...]

 

 

list関数の定形は以下のとおりです。

 

変数名 = list('リスト化したい文字列')

 

 

リストの書き換えについて。

l = ['a''b''c''d''e''f''g']
ll = [12345678910]
lll = [12223]


l[0= 'x'               #l[0]の値にxを再代入
print(l)                 #['x', 'b', 'c', 'd', 'e', 'f', 'g']

l[2:5= ['C''D''E'#l[2:5]の値にCとDとEを再代入
print(l)                 #['x', 'b', 'C', 'D', 'E', 'f', 'g']

l[2:5= []              #l[2:5]の値の代わりに空のリストを再代入
print(l)                 #['x', 'b', 'f', 'g']

l[:] = ['a']             #lのすべての値の代わりにaを再代入
print(l)                 #['a']

ll.append(99)            #llの末尾に99を追加で代入
print(ll)                #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 99]

ll.insert(00)          #ll[0]に0を追加で代入(既存の値は1つ後ろにずれる)
print(ll)                #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 99]

ll.pop(3)                #ll[3]の値を取り除く
ll.pop()                 #llの末尾の値を取り除く
print(ll)                #[0, 1, 2, 4, 5, 6, 7, 8, 9, 10]

del ll[0]                #ll[0]の値を削除
print(ll)                #[1, 2, 4, 5, 6, 7, 8, 9, 10]

del ll                   #llそのものを削除
print(ll)                #NameError(変数llが存在しない)

lll.remove(2)            #lllの中から2(value)を1つ取り除く
print(lll)               #[1, 2, 2, 3]

la = l + lll             #lとlllのリストを結合してlaに代入
print(la)                #['a', 1, 2, 2, 3]

l += lll                 #lとlllのリストを結合してlに再代入
print(l)                 #['a', 1, 2, 2, 3]

la.extend(l)             #laの末尾にlのvalueをリスト結合の形で代入
print(la)                #['a', 1, 2, 2, 3, 'a', 1, 2, 2, 3]

Pythonでリストの値(value)を書き換えるには、上記のような方法があります。

 

appendはリストで使えるメソッドです。

appendは左辺に指定したリストの末尾にパラメータで指定した値を追加で代入します。

 

insertもリストで使えるメソッドです。

insertは左辺に指定したリストに、メソッドの第1パラメータに指定した値のインデックスに第2パラメータに指定した値を追加で代入します。

なお、insertで値が代入された際の既存リストの値のインデックスは1つずつ後ろにずれます。

 

popもリストで使えるメソッドです。

popは左辺に指定したリストから、パラメータに指定した値のインデックスにあるvalueを取り除きます。

もしパラメータを指定しなかった場合はリスト末尾の値を取り除きます。

 

del文もメソッドではありませんがリストで使えます。

dell文は右辺に指定したリストのインデックスに代入されている値を削除します。

もしインデックスを指定しなかった場合は、その変数自体を削除してしまいます。

 

removeもリストで使えるメソッドです。

removeは左辺に指定したリストから、パラメータに指定したvalueを1つ取り除きます。

 

extendもリストで使えるメソッドです。

extendは左辺に指定したリストの末尾にパラメータに指定した値(リスト)を追加で代入します。

 

 

その他リストのメソッドとhelp関数について。

l = [12345123]
ls = '私は グラタンが 食べたい よ。'


#indexメソッド
print(l.index(3))     #2(0より後の最初にある3のindexを取得)
print(l.index(33))  #3(index3以降で最初にある3のindexを取得)


#countメソッド
print(l.count(3))     #2(リスト内の3が何個あるかを取得)


#if文
if 5 in l:
  print('5あります')  #5あります(lに5があれば実行)
else:
  print('5ないです')  #実行されない(lに5がなければ実行)


#sortメソッド
l.sort()              #lの値を昇順に並べ替える
print(l)              #[1, 1, 2, 2, 3, 3, 4, 5]

l.sort(reverse=True)  #lを降順に並び替える
print(l)              #[5, 4, 3, 3, 2, 2, 1, 1]

l.reverse()           #lを現在とは逆の順番に並び替える(昇順or降順)
print(l)              #[1, 1, 2, 2, 3, 3, 4, 5]


#splitメソッド
ls2 = ls.split(' ')   #lsの値を で区切ってリスト化する
print(ls2)            #['私は', 'グラタンが', '食べたい', 'よ。']

ls3 = ls.split('xyz'#lsに存在しない値を指定すると値がそのままリスト化
print(ls3)            #['私は グラタンが 食べたい よ。']


#joinメソッド
ls4 = ''.join(ls2)    #ls2の各値を指定した値で連結してリストを解除
print(ls4)            #私はグラタンが食べたいよ。

ls4
 = '、'.join (ls2#ls2の各値を'、'で連結してリストを解除
print(ls4)            #私は、グラタンが、食べたい、よ。


#help関数を使ってリストのメソッドを調べる
print(help(list))     #ターミナルにlistクラスの情報が表示される

リストの書き換えに使用したメソッドのほかにも、listクラスにはいろいろなメソッドが用意されています。

 

indexメソッドは、指定した値に割り振られているindex(添え字)の値を取得します。

 

countメソッドは、そのリスト内に指定した値が何個あるのかを整数で返してくれます。

 

sortメソッドは、指定したリストの各値を昇順に並び替えます。

sortメソッドのパラメータに reverse=True と記述すると、リストの並び替えが昇順から降順に変化します。

 

reverseメソッドは、リストの各値を現在とは逆の順番で並び替えます。

sort()は昇順で固定、sort(reverse=True)は降順で固定ですが、reverse()は現在のリストの並び順で昇順にして返すか降順にして返すかが相対的に変化します。

 

splitメソッドは、イテレータではない値をパラメータで指定した値で区切ってリスト化します。

もし指定した値が存在しない場合は、そのままの値をindex[0]でリスト化します。

 

joinメソッドは、リストの各値を指定した値で連結してリストを解除して返します。

左辺に空の値を指定した場合は、ただ単に各リストの値を頭から連結しただけの1つの値を返します。

 

 

メソッドなどを含めて、listクラスについての情報が知りたいときはhelp関数を使うといいでしょう。

print(help(list)) を実行すれば、ターミナルにlistクラスの情報がいろいろと表示されます。

 

 

リストのコピー(値渡しと参照渡し)について。

l = [12345#イテレータ
i = 12345           #int型
s = 'abcde'         #str型

a = l               #lをaに参照渡し
b = l.copy()        #lをbに値渡し
c = l[:]            #lをcに値渡し(推奨されない記述法)
d = i               #iをdに値渡し
e = s               #sをeに値渡し

print(l)            #[1, 2, 3, 4, 5]
print(a)            #[1, 2, 3, 4, 5]
print(b)            #[1, 2, 3, 4, 5]
print(c)            #[1, 2, 3, 4, 5]


a[0= 10           #aのindex0に10を再代入
d = 56789
e = 'efghi'

print(l)            #[10, 2, 3, 4, 5] 参照渡しなので参照元にも代入される
print(a)            #[10, 2, 3, 4, 5]
print(b)            #[1, 2, 3, 4, 5] 値渡しなので問題なし
print(c)            #[1, 2, 3, 4, 5] 同上
print(i)            #12345 ing型は値渡しなので問題なし
print(s)            #abcde str型も値渡しなので問題なし
print(d)            #56789
print(e)            #efghi

print(id(l))        #1204652083840
print(id(a))        #1204652083840 参照渡しなのでlとidが一致
print(id(b))        #1204653648256 値渡しなのでlとidが違う
print(id(c))        #1204653742272 同上

リストの変数aを他の変数bに代入するときは、値が値渡しではなく参照渡しになる点に注意が必要です。

 

値渡しでは、変数aと変数bはそれぞれ別のidで管理されている別のオブジェクトとしてあつかわれます。

しかし参照渡しでは、変数aと変数bはそれぞれが同じidで管理されている同じオブジェクトとしてあつかわれてしまいます。

 

int型やstr型のデータは特に気にしなくても最初から値渡しなので問題はないのですが、リストや辞書などのイテレータは参照渡しになってしまうので、変数の代入には若干の注意が必要です。

 

 

上記スクリプトの変数aは、リストである変数lを代入したオブジェクトです。

変数aと変数lには現在同じ値が入っていますが、この2つの変数がそれぞれ別のオブジェクトであれば、変数aのリストに別の値を代入しても元の変数lには何の変化も起こらないと考えるのが普通です。

 

しかしリストは参照渡しなので、変数aに値を再代入すると、なんと参照元の変数lの値までもが同値に再代入されてしまいます。

 

このようなイテレータの参照渡しを値渡しに変更するには、copyメソッドを使用します。

copyメソッドを使用して代入された値は、たとえイテレータであっても値渡しとして変数に代入されます。

 

 

変数のidを調べるにはid関数を使います。

id関数はパラメータにidを調べたい変数を入れると、その変数のidを13桁の整数で返してくれます。

 

このidが同値でなければ、それは別々のオブジェクトであると言えます。

もし別々の変数なのにこのidが同値であるならば、それは参照渡しになっている状態であると言えます。

 

 

以上です。