AtcoderとかPaizaの問題を解く過程で知ったListの小ネタを備忘録代わりにまとめる。
新発見があれば追記する予定。
(2019/7/25 間違っている部分を修正。コメントありがとうございます。)
#内包表記
Pythonのリストといえばこれ。可読性が落ちる代わりに処理速度が上がる。
例えば標準入力で3つの数値を受け取る場合、
#入力が"1 2 3"の時
a,b,c = [int(i) for i in input().split(" ")]
#1,2,3
これでまとめて数値として読み取れる。
##内包表記内にif文if節を組み込む場合
6. 式 (expression) — Python 3.7.4 ドキュメント
#[1,2,3,5,6,7]から偶数だけ取り出す。
lst = [ i for i in [1,2,3,5,6,7] if i%2==0 ]
#[2, 6]
#[1,2,3,5,6,7]を偶数ならそのまま、奇数なら"hoge"にする。
lst = [ i if i%2==0 else "hoge" for i in [1,2,3,5,6,7] ]
#['hoge', 2, 'hoge', 'hoge', 6, 'hoge']
elseがある場合はifの位置が変わるため注意。
##入れ子にもできる
#3*3の0の入ったリストを作成する
lst = [[ 0 for i in range(n) ] for i in range(n) ]
#[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
・・・読みづらい。
#スライス
元のリストをそのままに、一部の要素を切り出したリストを作れる。
lst=[0,1,2,3,4,5]
lst[1::]
# [1, 2, 3, 4, 5]
lst[:3:]
# [0, 1, 2]
lst[::2]
# [0, 2, 4]
表記法は
リスト[(始点):(終点):(ステップ数)]
#組み込み関数zip()で回転転置
Pythonリスト型の二次元配列の行と列を入れ替える(転置)
組み込み関数で2次元リストの転置ができるらしい。
組み込み関数 — Python 3.7.4 ドキュメント
それぞれのイテラブルから要素を集めたイテレータを作ります。
この関数はタプルのイテレータを返し、その i 番目のタプルは引数シーケンスまたはイテラブルそれぞれの i 番目の要素を含みます。
ということらしい。ただし帰ってくるのはタプルなので、リストとして用いたい場合は各要素をlist()メソッドで変換する必要がある。
n=4
lst=[[ i for i in range(n) ] for i in range(n+1) ]
# [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
list(zip(*lst))
# [(0, 0, 0, 0, 0), (1, 1, 1, 1, 1), (2, 2, 2, 2, 2), (3, 3, 3, 3, 3)]
#max()、min()メソッドで数値の比較
当たり前だけど要素が2個しかなければただの比較になる。速いのかどうかは良くわからないけ1行で比較ができるのは楽。
max(2,4)
# 4
min(2,4)
# 2
#負の要素数
基本的なことなのにいつも忘れてしまう。もちろんスライスでも負の数を指定できる。
lst=[0,1,2,3,4,5]
lst[-1]
# 5