くれなゐの雑記

身の回りの人や自分が困っていたことを記事にしています

Python3で競技プログラミングめも

Motivation

Pythonで競技やったら早そう(小並感)と思ったのでABC039をPython3でやってみた
なれたら早そうという印象
実行時間はC++に比べて10倍程度になると思っておいて良い?
C++と比較しながらPython3でのプログラミングをメモしていく(基礎テクニックを随時更新予定)

C++との比較

入力
line = input() # そのまま入力すると文字列型になる(1行分一括)
tokens = input().split() # これでスペース区切りの文字列の配列を作る

num = int(input()) # 入力が1行に1つの数字だけだったらこれで数字
nums = list(map(int, input().split())) # これで数字のデータのスペース区切りの配列

A, B, C = list(map(int, input().split())) # こうすると3つの数字がA, B, Cの順に入る
出力
print("str") #=> "str\n"
print("str", end=" ")#=> "str "
print("str", end="")#=> "str"
print("{0} {1} {2}".format(0, "a", 2)) # フォーマット記法というらしい(まだ使ってない)
arr = [1, 2, 3, 4, 5, 6] # ただの配列宣言
print(*arr) #=> "1 2 3 4 5 6\n"
print("{:>6}".format(1)) #=>  "     1\n"
print("{:>06}".format(1)) #=> "000001\n"
print("{:>.6}".format(1)) #=> "1.000000\n"
配列(vector相当)
a = [0]*114514 # 114514のサイズを持つ配列を定義(中身は0)
arr = [] #空の配列を宣言
arr.append() #これで.push_back()相当 (型は一様でもなくても可)
2次元配列の宣言
a = [[0 for i in range(W)] for j in range(H)] # arr[H][W] = {}相当
arr = [] # 空の配列を宣言
arr.append([]) # 配列を追加することで動的に二次元配列を作ることができる
REP
for i in range(H): # REP(i,H) <=> for(int i=0;i<H;++i) 相当
 arr[i]
if(0 <= x && x < H)
if 0 <= x < H:
 arr[x]
グローバル変数的な?
def func(): #このように変数があれば引数に渡さずとも使用可能
 global S # この1行がないとたとえばS=3みたいなのを書いた時にそっちを参照されるケースがある グローバル変数を使うなら明記する
 print(S) 

S = "abc"
三項演算子
 print("OK") if True else print("NG") # (True if Boolean else False)
インクリメント
 i += 1 # i++はないです
部分配列
arr[x:y] # [x,y)な部分配列を表す(x or yは省略可 省略した場合は最初か最後を指定する感じ)
sum(arr[x:y]) # こういう使い方や
arr[1:]+arr[:1] # こうすると配列をrotateさせることができる 
std::map
dict = {} # これでC++のstd::mapっぽいことができる
dict['a'] = 3 # こんな感じで作成, アクセス可能
a == b && b == c
a == b == c
swap(a, b)
a,b = b, a
v.back()
v[-1] # 最終要素にアクセスする -2や-3も同様に後ろから

謝辞

おりさの氏とうさぎさんにいろいろおしえていただいた感謝