PUROGU LADESU

ポエムがメインのブログです。

速習Python:データ構造

リスト(配列) list

li = [5, 11, 40, 6, 55, 2, 7]
li[-1] #最後尾
li[2] #3番目
li[:2] #0-3番目の手前まで
li[:] #全部
len(li)

list('abcde') で文字列をリストに変換

li[::2] #全部を一つ飛ばしで取り出し
li[::-1] #全部を逆順で取り出し

リストの操作

li[2] = 30
li[2:4] = [3, 4]

li.append(100)
li.insert(0, 200)
li.pop() # 最後尾を取り出して削除
li.pop(0) # 先頭を取り出して削除
li.pop(1) # 指定を取り出して削除
del li[2] # 削除
del li # 変数自体が消えundefinedになる
li.remove(7) # 指定の値を持つ要素を削除

x + y # 結合
x += y # xを拡張
x.extend(y) # xを拡張

リストのメソッド

lis = ['a', 'b', 'c', 'd', 'e', 'c']
lis.index('b') # 値のインデックスを取得
lis.count('c') # いくつ含まれるか数える
lis.sort(reverse=False) # 小さい順に並べる(破壊的)
lis.reverse() # 順番を逆にする(破壊的)

リストに値が含まれるか
if 'b' in lis:
print('exist')

str = "this is a pen"
str.split() # 空白で分割してリストを返す。連続した空白は詰められる
str.split(",") # 分割文字の指定
','.join(lis) # 指定文字でリストを結合して文字列に

リストのコピー

リストの代入は参照が同じになるだけなので、コピーするには
y = x.copy()をつかう。(シャローコピー)
y = x[:] copyと同じだけどcopyがわかりやすい。

ティープコピーするには(オブジェクトの中のオブジェクトも複製)
import copy
y = copy.deepcopy(x)

print(id(x)) # idでオブジェクトのIDが分かる

タプル tuple

書き換えられないのが良い
タプルの値は書き換えられないが、タプルに入れたリストは書き換えられる(参照型なので)
タプルは結合できる
順番は保証され、イテレータが使える

t = (1, 2, 3) # カッコはなくても良い
t[0]
t[0] = 9 # 代入は出来ません
t[:2]
t.index('p') # インデックスを取得
t.count('p') # 個数を取得

t = () # タプルになる
t = (1) # intになる
t = 1, # カンマを付けるとタプルになる
t = (1,) # タプルになる

関数の戻り値のアンパッキング
多すぎるアンパッキングはよろしくない
x, y = (10, 20)
a, b = b, a # 入れ替え

辞書型 ディクショナリ dictionary

配列より検索が早い
数字もキーにできる
キーの順番が保証される(v3.7〜)

定義の方法。どれも同じ
d = {'x': 10, 'y': 20}
d2 = dict(a= 10, b= 20)
d3 = dict([('a',10), ('b',20)])

d['x']
d['z'] = 30

d.get('x') # キーがなくてもエラーにならない
d.keys() # キーのみをリストで返す
d.values() # 値のみをリストで返す
d.items() # キーと値のタプルをリストで返す
d.update({'y': 99}) # 上書きしてマージ
d.setdefault('z', 0) # 指定キーがない場合のデフォルト値
d.pop('x') # 取り出して削除
del d['x'] # 削除
d.clear() # 空にする
'a' in d # キーが存在するか

辞書のコピー

辞書の代入は参照が同じになるだけなので、コピーするには
y = x.copy()をつかう。(シャローコピー)
y = x.copy()

集合型 set

値の集まり、インデックスとかはない。
同じ値をセットしても重複は排除される。
set()で配列から変換できる。

a = {1,2,2,2,3}
b = {1,2,4,4}

a - b # aからbにあるものを除く difference()
a & b # 両方にあるもの intersection()
a | b # どちらかにあるもの union()
a ^ b # 重複していないもの symmetric_difference()
+ は無い
<= 部分集合 issubset()
>= 部分集合 issuperset()

集合のメソッド

a.add(9) # すでに存在するものを追加しても増えない
a.remove(3)

配列をsetに変換して重複を除く
fr = ['aaa', 'bbb', 'ccc', 'bbb']
frset = set(fr)