トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

リストメモ.py

[Python]

リストとは

可変のシーケンス型オブジェクト。
要素として任意の型のオブジェクトを格納することができる。
リストの要素は順番を持つ。

スライス、結合が可能。

角括弧で作成する。

リストのキューイング

shift

shiftはスライスを使わなくても、pop()メソッドの引数を0に指定することで簡単に実現できる。
r = a.pop(0)

unshift

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])