LoginSignup
3
4

More than 3 years have passed since last update.

(Python3)個人的にまとめておきたかったリスト関連の小技

Last updated at Posted at 2019-07-24

AtcoderとかPaizaの問題を解く過程で知ったListの小ネタを備忘録代わりにまとめる。
新発見があれば追記する予定。

(2019/7/25 間違っている部分を修正。コメントありがとうございます。)

内包表記

Pythonのリストといえばこれ。可読性が落ちる代わりに処理速度が上がる。
例えば標準入力で3つの数値を受け取る場合、

pori.py
#入力が"1 2 3"の時
a,b,c = [int(i) for i in input().split(" ")]
#1,2,3

これでまとめて数値として読み取れる。

内包表記内にif文if節を組み込む場合

6. 式 (expression) — Python 3.7.4 ドキュメント

pori.py
#[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の位置が変わるため注意。

入れ子にもできる

pori.py
#3*3の0の入ったリストを作成する
lst = [[ 0 for i in range(n) ] for i in range(n) ]
#[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

・・・読みづらい。

スライス

元のリストをそのままに、一部の要素を切り出したリストを作れる。

pori.py
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()メソッドで変換する必要がある。

pori.py
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行で比較ができるのは楽。

pori.py
max(2,4)
# 4
min(2,4)
# 2

負の要素数

基本的なことなのにいつも忘れてしまう。もちろんスライスでも負の数を指定できる。

pori.py
lst=[0,1,2,3,4,5]
lst[-1]
# 5
3
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4