リストだけで1記事作れてしまうほど長くなってしまいました。
それだけ頻繁に使ったということですね。
リスト
python では「配列」ではなく「リスト」。
(最初の頃は「配列」の使い方を検索していました……)
要素の削除
list.remove(elem)
マッチした最初の要素しか削除しないことに注意。
インデックスで削除したい場合は del を使う。
del(list[idx])
スライス指定もできる。
del(list[i:j])
複数の要素を同時に削除する関数はない。
私は以下のようにしている。
c = 0 for i in delete_target_indexes: del(a[i-c]) c += 1
2次元配列の作成
内包表記で書くと簡単。
a = [[0 for _ in xrange(10)] for _ in xrange(20)]
これで、全ての要素が 0 である 20*10 のリストができる。
内包表記における if 文
GCJ2009 1B-B ide が数字文字列から0以外の数字を抜き出して配列にする際にこの手法を使っていた。
s = [x for x in v if x != '0']
リストの結合
a = [1,2,3] b = [4,5] print a + b a.append(b) print a
出力は以下のようになる。
[1,2,3,4,5]
[1,2,3,[4,5] ]
単純に結合したい場合は + を使うこと。
ruby でいう Array.flatten()
そんなものはない。
index() の注意
一番最初に出てくる要素のインデックスしか返さないこと、ヒットしないときは ValueError を返すことに注意すること。
a = ["aaa","bbb","aaa"] # 0 しか返さない print a.index("aaa") # ValueError print a.index("ccc")
if 文の中などで要素があるかどうかチェックしたい場合は in を使うこと。
if val in list:
リスト中の最大要素、最小要素
max(a) min(a)
heapqモジュールのページによると、1つの最大値/最小値だけを取り出したい場合は min() や max() の方が heapq.smallest(), heapq.largest() より効率的らしい。
性能測定していないので実際のところは不明。
sort() の注意
インプレース演算、つまりオブジェクトそのものを変更することに注意。
a = [10,30,20] a.sort() print a
以下のように書くと、None が出力される。
a = [10,30,20] print a.sort()
sort()におけるcmp()
ユーザ定義による比較でソートすることができる。
例えば数値文字列を数値としてソートするには以下のようにすればいい。
list.sort(cmp=lambda x,y: cmp(int(x), int(y)))
ループで添字も一緒に取り出す
for i,v in enumerate(list):
指定場所への insert
s[1:1] = '0'
これで、s[0] と s[1] の間に 0 を挿入することができる。
ただし、シーケンス型しか挿入することができない。
以下のコードはエラーを吐く。
s[1:1] = 10
uniq()相当の処理
uniq()という関数自体はないが、以下のようにすれば同様のことができる。
b = list(set(a))