LoginSignup
2
1

More than 3 years have passed since last update.

AtCoderで手早く茶色になるための言語的知識 覚書(Python3)

Last updated at Posted at 2020-02-27

覚書です。自分がつまづいたことを付記していきます。

入出力

  • 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
"""
  • zip(*A)は2度繰り返すと元に戻ることを覚えておこう。列単位で操作して元の形に戻す時に使う。提出

  • 文字列の2次元配列を90度時計回りに回転させて出力。難。提出

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判定できる。
# こうは書かない
if i != 'M' and i != 'A' and i != 'R' and i != 'C' and i != 'H':

# こう書く
if i not in 'MARCH':
2
1
0

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
2
1