LoginSignup
3
4

More than 1 year has passed since last update.

PyGrade 「Python Basics40」 全問解答

Last updated at Posted at 2021-07-04

解いてみた感想

前半、ライブラリ知っていれば簡単だと思っていましたが、
後半、急激に難易度があがってかなり格闘しました。。
初回は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. 条件一致する要素を取得 / 降順 / スライス の組み合わせ

Q34.PNG

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. 行列の並び替え 

Q35.PNG

import numpy as np

def solution(A):
  return A[[0,1,3,2,4,5], :]

Q36. スライス / リストの内包表現 / 縦に結合

Q36.PNG

import numpy as np

def solution(A):
  return np.stack([A[i:i+7] for i in range(10)])

Q37. 文字列の任意文字を交換

Q37.PNG

return A.translate(str.maketrans('to','ot'))

Q38. 文字列の結合 / リストの内包表記 / 頭が大文字の単語を取得

Q38.PNG

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. 文字列の連結 / リストの要素を関数処理 / コードポイントを文字列変換

Q39.PNG

return ''.join(map(chr,A))

Q40. 文字列の置換replace / 文字列の分割sprit / 文字列の一部削除strip / リストの内包表現 / 任意の範囲の等差数列 range

Q40.PNG

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)]))
3
4
1

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
3
4