解いてみた感想
前半、ライブラリ知っていれば簡単だと思っていましたが、
後半、急激に難易度があがってかなり格闘しました。。
初回は4時間くらいかけて、ようやく完答。
前半、後半を基礎問題 / 応用問題(完全に主観)に分けてみました。
基礎問題の中にも、組み合わせが必要な問題があったり、
応用問題の中にも、知っていれば解ける問題が混ざっていますが、
前半、後半で2分割したほうが読みやすいと思い、そのままにしました。
基礎問題(Q1~33)
主に、文法やライブラリを知っているか、知らないか、を問う問題。答えのみ記載します。
問題が変わってしまったら、そのまま入力してもダメですが、
機械学習等で使う標準ライブラリは、それほど大きく変わらないと思いますので、
下記日本語でググれば、答えにたどり着くと思います。
問題を解く際には、型に注意してください。
リスト : list / 文字列 : str / 配列 : ndarray(行列 : 2次元配列) / 集合 : set
- Q1. リストの結合
return A + B
- Q2. リストのソート
return sorted(A)
- Q3. 辞書の書き換え
A['l'] = 450 ⇒ return A
- Q4. 文字列を連結
return ':'.join(A)
- Q5. 文字列置換
return A.replace('o', '*')
- Q6. 全要素0の配列生成
return np.zeros(15)
- Q7. 連番配列生成
return np.arange(19,39)
- Q8. 配列逆順
return A[::-1]
- Q9. 連番行列生成
return np.arange(8,57).reshape(7,7)
- Q10. 単位行列生成
return np.eye(5)
- Q11. 零行列生成
return np.zeros((4,10))
- Q12. 転置行列/1次元変換
return A.T.flatten()
- Q13. 配列の形状変換
return A.reshape(4,6)
- Q14. 配列の各要素を真偽判定
return A <=8
- Q15. 文字列逆順
return A[::-1]
- Q16. 和集合
return A | B
- Q17. リストの各要素に演算処理map/無名関数ラムダ式
return list(map(lambda x:2*x, A))
- Q18. Unicodeコードポイントを文字列に変換
return list(map(chr,A))
- Q19. 丸め処理
return list(map(round, A))
- Q20. 複数リストの要素をまとめ処理
return list(zip(A,B))
- Q21. 行ごとに最大値を取得
return A.max(axis=1)
- Q22. 行列の任意の行を取得(スライス)
return A[:3,:]
- Q23. 行列の対角成分のみ取得
return A * np.eye(7)
- Q24. ブロードキャスト
return A + B
- Q25. 行列の積
return np.dot(A,B)
- Q26. 配列の条件を満たす要素以外0とする
return A * (A >=11)
- Q27. 配列の条件を満たす要素を抽出
return A[A>=10]
- Q28. 行列を縦に結合
return np.vstack((A,B))
- Q29. 行列の任意の列を取得
A[:,:1].T
- Q30. 行列を行ごとに昇順に並べる
return np.sort(A)
- Q31. リストから条件を指定して要素を抽出
return list(filter(lambda x:x%5==0, A))
- Q32. 正規表現による置換
return re.sub('i..', '***',A)
- Q33. 辞書の値取得/重複なし
set(A.values())
応用問題(34~40問)
主に、ライブラリを組み合わせる必要がある問題。
Q34. 条件一致する要素を取得 / 降順 / スライス の組み合わせ
import numpy as np
def solution(A):
return sorted(A[A<=31],reverse = True)[2:]
※重複なしでソートかと思ったのですが、7と2が重複している
※ np.sort(A[A<=31][::-1])[2:]
はエラー
Q35. 行列の並び替え
import numpy as np
def solution(A):
return A[[0,1,3,2,4,5], :]
Q36. スライス / リストの内包表現 / 縦に結合
import numpy as np
def solution(A):
return np.stack([A[i:i+7] for i in range(10)])
Q37. 文字列の任意文字を交換
return A.translate(str.maketrans('to','ot'))
Q38. 文字列の結合 / リストの内包表記 / 頭が大文字の単語を取得
return ', '.join(s for s in A if s[0] < 'a')
※文字制限でエラーですが、文字数制限なければ、下記の通り記載するほうがわかりやすい
return ', '.join(s for s in A if s[0].isupper())
※re.sub使って、正規表現でも記載可
return ', '.join(re.findall('[A-Z][a-z]+', str(A)))
Q39. 文字列の連結 / リストの要素を関数処理 / コードポイントを文字列変換
return ''.join(map(chr,A))
Q40. 文字列の置換replace / 文字列の分割sprit / 文字列の一部削除strip / リストの内包表現 / 任意の範囲の等差数列 range
def solution(A):
l = A.replace('|',',').split(',')
return {l[i].strip():int(l[i+1]) for i in range(0,len(l),2)}
※ 正規表現でも可(他の問題で import re
しているから下記コードも通る)
73/80 bytes used
def solution(A):
k = re.findall('[a-z]+',A)
v = [int(s) for s in re.findall('\d+', A)]
return dict(zip(k,v))
あるいは、べた書きすれば、下記でも字数制限満たす(可読性は落ちるが)
75/80bytes used
import re
def solution(A):
return dict(zip(re.findall('[a-z]+',A),[int(s) for s in re.findall('\d+', A)]))