読者です 読者をやめる 読者になる 読者になる

Google Code Jam で得た Python の tips(2)

リストだけで1記事作れてしまうほど長くなってしまいました。
それだけ頻繁に使ったということですね。

目次

Part1
Part2(この記事)
  • リスト
Part3
  • 数学
  • ビット演算
  • 条件式
  • ループ
  • 例外処理
  • その他
  • おまけ:今回のテンプレート

リスト

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


出典:sort( )について少し詳しく - ひきメモ

ソートしてループ
for f in sorted(somelist):
    print f


ちなみに reversed() もある。


出典:公式チュートリアル

ループで添字も一緒に取り出す
for i,v in enumerate(list):
指定場所への insert
s[1:1] = '0'


これで、s[0] と s[1] の間に 0 を挿入することができる。
ただし、シーケンス型しか挿入することができない。
以下のコードはエラーを吐く。

s[1:1] = 10
リストのコピー
b = a[:]


b = a だとただの参照渡し。

出典:Tsuchiya Yoshihiro: pythonメモ:リストのコピー

uniq()相当の処理

uniq()という関数自体はないが、以下のようにすれば同様のことができる。

b = list(set(a))
リストによるスイッチ
a = ["aaa","bbb"]
t = 0
print a[t] + a[1-t]
t = 1
print a[t] + a[1-t]


要素数が2のとき、変数tを0,1と変えるだけで a[t],a[1-t]の値をスイッチできる。
上の出力結果は aaabbb, bbbaaa。



Part1 / Part2 / Part3