Python > データタイプ > 配列(List)


配列 (List) と書きながら、集合 (Set) とかもここに書いてしまった。
numpy でなくても array 型があるのを今知った。

module

組み込み型
set


l = [1,2,3,4,5,6]
l[0] 一番目
スライス
l[2:]

l[::2] 1文字飛ばし

Lecture 16 リストの操作

s[0] = "X" 要素の書き換え
s[2:5] = ['C','D','E']
s[2:5] = [] フラッシュ

リストの初期化

s = [0] * 4 # N個の 0 のリスト

文字列とリスト

文字列はリストと見ることができる。基本的に何もしなくても、「文字のリスト」とみなせる。
for s in S:  # S = "abcdefg"
    print(s)
 
リストとして明示するなら
list("abcdefg") 1文字ずつリスト化
反対向きに、.join(a) もある
','.join(a) # 上の続きで、"a,b,c,d" が返る
str.join(iterable)
.join(a)は、引数に文字列しか取れないので、数値の配列は一旦文字列に戻す必要がある。
" ".join(list(map(str, a)))
  1. map(str, a) で a の要素を一つ一つstr に変換。
  2. 出てきたものを list で リスト化
  3. 文字のリストを " " でつないで一つの「文字列」にしている。

参照である。

a = []
の a 自体は参照先なので
tmp = a
としてから、tmp を変更すると、a も変わる。
変えたくないなら、 tmp = a.copy() で渡す

多重配列時の注意

s = [[0] * 4 for x in range(3)]
s = [[0] * 4] * 3 と書くと、s[0][0] を更新した際に、s[1][0]まで更新されている。なぜ?
https://note.nkmk.me/python-list-initialize/


追加

s.append(100)  # 一番右(後ろ)につける O(1)
s.insert(場所、数字)# 場所を指定して入れる O(n)
 
s = [1,2,3]
s[1] = [0,1,2]  # [1, 0, 1, 2, 3]
 
s.pop(0) 先頭をポップする
 

連結

A = [1,2,3]
B = [4,5,6]
 
A.extend(B)  # A = [1,2,3,4,5,6] O(k)
 
A.extend(B) の戻り値ではない(Aが変更される)ことに注意


削除

n.remove(2) 2文字目削除
リストの足し算は、連結



Lecture 17 : リストのメソッド

r.index(3) 3が現れるインデックス

要素の数え上げ

l.count(3)  # 3が現れる回数
 
要素数が多いときに、可能性がある全ての因子で.count()を回すと、時間がかかる場合がある。その場合は、
import collections
c = collections.Counter(l)  # c は辞書型(のサブクラスのCounter型)
として、回数を求めることができ、こっちのほうが早かった。


並べ替え

l.sort()
自分自身が並べ変わる

sorted(l)
こちらは、並べ変わったリストが返る

並べ方

逆順に並べる

r.sort(reverse=True)

アルファベットを、大文字小文字関係なく並べる

ASCII順だと大文字と小文字が別に扱われるので key=str.lower を指定する
l.sort(key=str.lower)


r.reverse()
r.split("_")
.join()
Lecture 18 リストのコピー
i = j リストは参照渡し
j.copy なら実体渡し
j[:] なら実体渡し
id(x) アドレスのようなもの

Lecture 19 リストの使い所


集合(Set)

配列を「要素の集合」(順番は重要でない)とする場合は、set型を用いることもできる。組み込み型なので、import は不要。
集合なので、重複要素は一つにまとめられる。

s = set()  # 空集合の初期化
s1 = set([1,2,3])  #
s2 = set([2,3,4])  #
 
s12 = s1 | s2  # 和集合
s1_2 = s1 & s2  # 積集合
 
# 配列と同じで類推できるもの
len(s)  # 集合 s の要素数 (s の濃度) を返します。
x in s  # x が s のメンバーに含まれるか判定します。
x not in s  # x が s のメンバーに含まれていないことを判定します。
 
isdisjoint(other)
集合が other と共通の要素を持たないとき、True を返します。集合はそれらの積集合が空集合となるときのみ、互いに素 (disjoint) となります。
 
issubset(other)
set <= other  # set の全ての要素が other に含まれるか判定
set < other # set が other の真部分集合であるかを判定
 
issuperset(other)
set >= other  # other の全ての要素が set に含まれるか判定します。
set > other  # set が other の真上位集合であるかを判定
 
set.union(*others)  # 和集合の別の書き方
set.intersection(*others)  # 積集合の別の書き方
 
set.difference(*others)  # 
set - other - ...  # set に含まれて、かつ、全ての other に含まれない要素を持つ、新しい集合
 
symmetric_difference(other)
set ^ other  # 排他集合
 
copy() # 集合の浅いコピーを返します。


for で回す際に、set型のほうが高速らしい
https://tkkm.tokyo/post-173/

set に要素を加える

SET.add(value)

set から要素を取り出す

集合なので順番がない。添字では取り出せない。とりあえずpop()する。
何かしらの順番を作って、出すなら一旦リスト化 list(set) にする?

スタック、キュー

スタック

スタックなら、配列の append(), pop() で実装できる。

キュー

後ろから入れても、先頭から出せないので、collections モジュールから deque に登場してもらう必要あり。.popleft() で先から出す
from collections import decue
 
c = decue()
 
c.append(x)     # x を右側につけ加える
c.appendleft(x) # x を左側につけ加える
c.pop()         # 右側から要素をひとつ削除し、その要素を返す。要素がひとつも存在しない場合は IndexError を発生する。
c.popleft()     # 左側から要素をひとつ削除し、その要素を返す。要素がひとつも存在しない場合は IndexError を発生する。
 
c.extend(iter)  # イテラブルな引数 iter から得られる要素を右側に追加し拡張する。
c.extendleft(iter) # イテラブルな引数 iter から得られる要素を左側に追加し拡張します。注意: 左から追加した結果は、イテラブルな引数の順序とは逆になります。
 
c.clear()       # すべての要素を削除し、長さを 0 にします。
 
copy()
deque の浅いコピーを作成します。バージョン 3.5 で追加.
 
c.count(x)        # x に等しい要素を数え上げます。バージョン 3.2 で追加.
 
 
index(x[, start[, stop]])
deque 内の x の位置を返します (インデックス start からインデックス stop の両端を含む範囲で)。最初のマッチを返すか、見つからない場合には ValueError を発生させます。
 
バージョン 3.5 で追加.
 
insert(i, x)
x を deque の位置 i に挿入します。
 
挿入によって、長さに制限のある deque の長さが maxlen を超える場合、IndexError が発生します。
 
バージョン 3.5 で追加.
 
c.remove(x) # x の最初に現れるものを削除します。要素が見付からないない場合は ValueError を送出します。
c.reverse() # 要素をインプレースに反転し、None を返します。
 
バージョン 3.2 で追加.
 
c.rotate(n=1) # 要素を全体で n ステップだけ右にローテートします。n が負の値の場合は、左にローテートします。
 
# deque が空でないときは、 deque をひとつ右にローテートすることは d.appendleft(d.pop()) と同じで、 deque をひとつ左にローテートすることは d.append(d.popleft()) と同じです。
 
deque オブジェクトは読み出し専用属性も 1 つ提供しています:
 
maxlen
deque の最大長で、制限されていなければ None です。
 
バージョン 3.1 で追加.
 

優先度付きキュー


比較するものを頭に持ってくるのが大切。比較演算子をわざわざ定義すると面倒。でも、できないことはない?
https://teratail.com/questions/88396

最終更新:2020年06月27日 18:40