覚書です。自分がつまづいたことを付記していきます。
入出力
-
EOF reading line
が出る時は、入力ループを回す回数を間違えていないかチェックしよう
for a in array:
print(*a)
で2次元配列をアンパック。
- 改行して要素出力するなら普通に
for i in I:
print(i)
- 最後の1文字だけ出力されない、という時は最後の改行を忘れているのかもしれません。チェック。
zipを使いこなす
-
B=zip(*A)
でAの列を行と化すことができる。zipオブジェクトなので、printする場合はアンパック。
A=[[0,0,0,0],[1,2,3,4],[3,4,5,6]]
C=zip(*A)
# だめな例 print(C)
# よい例
for i in C:
print(*i)
"""
0 1 3
0 2 4
0 3 5
0 4 6
"""
for i in zip(*s): # i列目の要素について一括操作
# 後ろから参照することで90度回転した行列が作れる。空白なしでアンパック
print(*i[::-1], sep='')
リスト内包表記
- min,ループ,sumを内包表記で一気に書く。
sum([min(A[i]-A[i-1],T) for i in range(1,N)])
- 多重ループ(提出)
サンプルコードは、n円ぴったりになる4円玉と7円玉(100枚が上限)の組み合わせがあるかどうかという問題。
print('Yes' if n in [4*x+7*y for x in range(101) for y in range(101)] else 'No')
l=[i for i in l if i not in ['a','i','u','e','o']]
で、['a','i','u','e','o']
に入っていない要素をl
から抹消。かぶりをすべて消すためにはremove()
ではなくこうした内包表記を使用。
ゼロ埋め
-
str.zfill(n)
でn桁のゼロ埋め。
-
"%06d%06d" % (p, q)
で、int型のpとqについて6桁のゼロ埋めを行った文字列を出力
itertoolsを使いこなす
-
itertools.permutations
で順列生成。提出 -
combinationを選んでそれらに対して処理をするとき:
for a, b, c in combinations(list_l, 3):
hoge
collections.Counter
- dict型のメソッドが使える
# iはkeyを参照する
for i in Counter(S):
# valueを参照
Counter(S)[i]
アンパック
変数数<=要素数のとき、*変数名
で、要素がリストとしてまとめて代入される。
t = (0, 1, 2, 3, 4)
a, b, *c = t
# a == 0
# b == 1
# c == [2, 3, 4]
# ls = list(set(arr))と等価
*ls, = set(arr)
その他
-
min
の更新。forの中にif文を書く手間は省く。
ans=10**9
for i in ...:
ans=min(ans, hoge)
- 複数の文字列の間で同じ種類の文字が何個あるか→set型にし、intersectionとってlenを測る。提出
print(max(len(set(s[:i])&set(s[i:])) for i in range(n)))
- 型変換可能か判定→例外処理で書く
try:
int(s)
except:
print('No')
sがint型に変換できないなら'No'
とプリントしている。
- 文字列型も大小比較できます! 大きい方が辞書で後ろに来る。
- for all文とexist文をall()関数およびany()関数で書けます。
例:Aの全ての要素が偶数である限り処理をする。
while all(i%2==0 for i in A):
hoge
-
or
は左側がFalse
の場合右側を返す。- 例:set(lowercase)にのみ含まれているものの集合のmin、あるいはそれがなければ['None']のmin(つまり'None')を返せ。提出
print(min(set(lowercase)-set(s) or ['None']))
-
多次元配列のスライスはNumpyを使おう。ただ、同一性判定などのときに
(A==B).all()
などと書く必要があることに注意。提出 -
誤差が出るので根号は2乗するなりそれを2回繰り返すなりして外しましょう。cf. パナソニックプログラミングコンテスト2020 C - Sqrt Inequality
-
np.argsort(A)
で、配列A
をvalueでソートしたときのindexの配列を取得。
N=int(input())
S=[''.join(sorted(input())) for i in range(N)]
C=Counter(S)
print(sum(i*(i-1)//2 for i in C.values()))
- rangeの逆順は組み込み関数
reversed()
を使おう。
print(list(reversed(range(3, 10, 2))))
# [9, 7, 5, 3]
-
np.rot90(d)
でndarrayを回転。 -
enumerate関数で配列の
インデックス番号, 要素
を取得できる。 -
2番目に大きな値をリストから取得→set型、sort、-2でインデックス参照。
n=int(input())
l=[int(input()) for _ in range(n)]
print(sorted(set(l))[-2])
- 与えられたリストSの[l-1:r]の範囲の部分文字列を反転。S[l-1:r][::-1]で当該部分を反転して、それを代入。
S=list(input())
l,r=map(int,input().split())
S[l-1:r]=S[l-1:r][::-1]
# リストをアンパック。そのさい空白除去。''.join(S)よりこっちにしたい
print(*S,sep='')
-
int型nについて
if n=='1'
などと書かない。if n==1
。 -
max関数について、空リストをとったときに0を返すように指定。
max(iterable, default = 0)
-
多次元リストの要素に処理するfor文
-
for [p,y] in data:
hoge
* 文字列についても`in`判定できる。
```Python
# こうは書かない
if i != 'M' and i != 'A' and i != 'R' and i != 'C' and i != 'H':
# こう書く
if i not in 'MARCH':