- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
{{category Python}}
!!! リストとは
可変のシーケンス型オブジェクト。
要素として任意の型のオブジェクトを格納することができる。
リストの要素は順番を持つ。
スライス、結合が可能。
角括弧で作成する。
!!! リストのキューイング
!! shift
shiftはスライスを使わなくても、pop()メソッドの引数を0に指定することで簡単に実現できる。
r = a.pop(0)
!! unshift
unshiftはスライスで実現できるが、要素が1個の場合は insert(0, x) が使える。
unshiftはスライスで実現できるが、挿入したい要素が1個の場合は insert(0, x) が使える。
リストの先頭に要素1を挿入。
a.insert(0, 1)
a[:0] = [1]
リストの先頭にリストを拡張挿入。
a[:0] = [1, 2]
!! push
リストの末尾に要素5を挿入。
a.append(5)
リストの末尾にリストを拡張挿入。
a.extend([5, 6])
!! pop
r = a.pop()
!!! リストのコピー
Pythonでは変数に代入をしても、オブジェクトへの参照がコピーされるだけなので、すべての変数が同じオブジェクトを指す。
a = [0, 1, 2, 3]
# aを破壊したいので、破壊用に変数bにコピー
b = a
b[2:4] = [5, 6]
# print(a) shows [0, 1, 5, 6]
これだと、bを破壊するとaも破壊される(aとbが参照しているオブジェクトは同じだから)。
リストをコピーするには、スライスの全要素参照を使う。
b = a[:]
a[:]は、aと同じ値の要素を持つ、別のリストオブジェクトを返す。
!!! リストのクリア
a[:] = []
リスト全てを表すスライスを左辺、空リストを右辺。
!!! リストのソート
* list.sort()
* sortedlist = sorted(list)
!! keyオプション
sort()、sorted()には key オプションを指定できる。keyオプションに指定できるのは、元のリストからどう比較値を抜き出すかを定義した関数。
文字列のリストを大文字小文字を意識せずに比較したい:
str_list.sort(key=str.lower)
入れ子リストのソート:
特に何も指定しなければ、各要素シーケンスの0番目の値から順番に比較が行われる。シーケンスの任意の要素順でソートしたい場合は下記のように、比較したい順を並び替えた要素を返す関数を key 引数に指定する。
並び替える要素として、元のシーケンスの要素個分を返す必要はない。比較したい要素だけを並び替えて返せばよい。
t_list = [('key1', 5), ('key2', 10), ('key3', 7), ('key4', 8), ('key5', 2)]
sorted_list = sorted(t_list, key=lambda x:(x[1], x[0]))
keyに指定した関数にリストの値が与えられ、その返り値同士が比較される。
Python 3では比較可能でないオブジェクト同士を比較すると、例外が発生する。
!! reverseオプション
降順でソートする。
a_list.sort(reverse=True)
!!! ディクショナリーとリストの相互変換
!! ディクショナリーをリストに展開する
リスト内包表記を使う。
pair_list = [x for x in d.items()]
「キーと値のタプル」のリストができる。
[(key0, value0),(key1, value1),(key2, value2),...] みたいな感じ。
!! キーと値のタプルのリストをディクショナリーにする
ディクショナリーでも内包表記が可能に。上のように展開したキーと値のタプルのリストを、元のディクショナリーに戻す。
d = {x[0]:x[1] for x in pair_list}
内包表記は set でも使えるとのこと。
!! キーのリストと値のリストからディクショナリーを作る
キーのリスト [key0, key1, key2, ...] と値のリスト [value0, value1, value2, ...]からディクショナリーを作る。
zip()を使う。
d = {x:y for x,y in zip(keys, values)}
!! キーと値がならんだリストをディクショナリーにする
a = [key0, value0, key1, value1, key2, value2,...]
これは、一度キーだけのタプル、値だけのタプルを作って、上記の内包表記で処理する。
keytup = a[0::2]
valuetup = a[1::2]
d = {x:y for x,y in zip(keytup, valuetup)}
一行版
d = {x:y for x,y in zip(a[0::2], a[1::2])