# 想定読者 普段からスクリプト程度にPythonを使っていて、競技プログラミングを始める人。想定AtCoder ABCのB~くらいを解くぞ!という人向け # 表示 ## printf構文 まず、注意することとして、フォーマット文字列はpython3.6移行の機能であるため、使えないことに注意 ``` Python # Pyhton 3.6 >>> print(f'{2:02}') 02 # Python 3.5 >>> print(f'{2:02}') SyntaxError: invalid syntax ``` このため、AtCoderでは従来の%構文で対応する。 ```Python # 整数表示 >>> print("[%03d] [%3d] [%+d]" % (10, 10, 10) ) [010] [ 10] [+10] # 小数点の表示桁数制限 >>> print("%.4f" % (1/2) ) 0.5000 # 小数点, 小数部をいれてn桁表示 >>> print("[%08.4f]" % (1/2) ) [000.5000] # n文字reserveしてprintf >>> print("[%4s] [%-4s]" % ("!", "!") ) [ !] [! ] # 16, 8 進数 >>> print("[%x %o]" % (255, 255) ) [ff 377] ``` # 数値 # 2進数 # リスト操作 ## 複数行読み込みのリスト化(内包リスト) ```Python n = int(input()) # 内包リスト dat_a = [int(input()) for _ in range(n)] # 使わない場合 dat_a = [] for i in range(n): dat_a.append(int(input)) ``` ## 特定の内容だけのリスト(filter, 内包リスト) filterを使ってもいいがlist()しないとprintはできない。 ``` Python l = range(10) # 内包リスト print([x for x in l if x % 3 == 0]) l = range(10) # filterのままだと になるのでlist()する print(filter(lambda x: x % 3 == 0, l)) print(list(filter(lambda x: x % 3 == 0, l))) # 普通に書く場合 r = [] for i in range(len(l)): if l[i] % 3 == 0: r.append(i) print(r) ``` # reduce functools以下になってしまったので少し面倒。 ```Python from functools import reduce l = range(10) print(reduce(lambda x, y: x + y, l)) ``` # set() ```Python l = [1,2,3,2,3,4,2,3,4,1,2,5] # set s = set(l) # set化された後の追加はadd s.add(4) print(s) # > {1, 2, 3, 4, 5} print("len = " + str(len(s))) # > len = 5 print(list(reversed(list(s)))) # reverseしたいときは一度、listに変換して、reversed objectをlistにまた戻す # > [5, 4, 3, 2, 1] # setはlistっぽいがlistではないのでindexは使えない。listにすること。 #>>> s[0] #TypeError: 'set' object does not support indexing #>>>list(s)[0] #1 ``` # Counter: ```Python l = [1,2,3,2,3,4,2,3,4,1,2,5] import collections c = collections.Counter(l) print(c) # Counter({2: 4, 3: 3, 1: 2, 4: 2, 5: 1}) # 昇順での頻出単語 m = c.most_common() print(m) # [(2, 4), (3, 3), (1, 2), (4, 2), (5, 1)] # most_commonは昇順でのn個を引数にとる m = c.most_common(2) print(m) # [(2, 4), (3, 3)] # 最小順からの数え上げはmost_common = 昇順の結果を::-1 (逆転)してからとる m = c.most_common()[::-1][:2] print(m) # [(2, 4), (3, 3)] # こうやったほうが少し軽いかもしれない? n = 2 m = c.most_common()[:-2-1 :-1] print(m) # [(2, 4), (3, 3)] m = c.most_common(3) print(m) # [(2, 4), (3, 3), (1, 2)] # ここでの注意は頭から3番目を表示しているだけで、3位タイを表示しない。上記なら(4,2)も帰ってくると思いがち # ★辞書からの文字削除 del c[2] m = c.most_common(3) print(m) # [(3, 3), (1, 2), (4, 2)] # Subtract カウンタ同士の引き算が可能 c = collections.Counter(l) print(c) # Counter({2: 4, 3: 3, 1: 2, 4: 2, 5: 1}) c.subtract([5,5]) print(c) # Counter({2: 4, 3: 3, 1: 2, 4: 2, 5: -1}) ★負にもなれる print(+c) # Counter({2: 4, 3: 3, 1: 2, 4: 2}) 正のカウンタのみ表示 print(-c) # Counter({5: 1}) 負のカウンタのみ表示 print( (-c).most_common() ) # [(5, 1)] ★↑(-c)としないで-c.とすると結果が異なるので注意 print( list(map(lambda x: (x[0], -x[1]), (-c).most_common() ))) # [(5, -1)] どうしてもマイナス表記でほしいのなら↑とかかな... ``` # namedtuple: 競技プログラミングではあまりつかわないかも ```Python from collections import namedtuple P = namedtuple("p", ["x", "y"]) l = [] l.append(P(0,0)) l.append(P(0,1)) print(l) # [p(x=0, y=0), p(x=0, y=1)] p = P(1,2) print(p.x) # 1 print(p[0]) # 1 ```