PyGrade 「Python Basics40」 全問解答

## 解いてみた感想
前半、ライブラリ知っていれば簡単だと思っていましたが、
後半、急激に難易度があがってかなり格闘しました。。
初回は4時間くらいかけて、ようやく完答。
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599065/bfdddbb0-2baf-647f-c09f-f0f28ae58eda.png">

前半、後半を基礎問題 / 応用問題（完全に主観）に分けてみました。
基礎問題の中にも、組み合わせが必要な問題があったり、
応用問題の中にも、知っていれば解ける問題が混ざっていますが、
前半、後半で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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599065/481e2d54-8562-08fe-a4f0-d27aad828eeb.png)

```Python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599065/9aebca9d-82f4-c6f1-ec59-b8ed29513507.png)

```Python
import numpy as np

def solution(A):
  return A[[0,1,3,2,4,5], :]
```
### Q36. スライス / リストの内包表現 / 縦に結合

![Q36.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599065/88be8960-7902-971f-422b-71d1b9f54a58.png)

```Python
import numpy as np

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

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

![Q37.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599065/1276a648-8dfd-eda0-6528-f87cdb4487b5.png)

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

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

![Q38.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599065/1b3a96f1-2d19-fc04-85bf-a3be6e848322.png)

```Python
return ', '.join(s for s in A if s[0] < 'a')
```
※文字制限でエラーですが、文字数制限なければ、下記の通り記載するほうがわかりやすい

```Python
return ', '.join(s for s in A if s[0].isupper())
```

※re.sub使って、正規表現でも記載可 

```Python
return ', '.join(re.findall('[A-Z][a-z]+', str(A)))
```

### Q39. 文字列の連結 / リストの要素を関数処理 / コードポイントを文字列変換

![Q39.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599065/b79487cc-b6dd-544f-31d3-eb4a50b6945e.png)

```Python
return ''.join(map(chr,A))
```
### Q40. 文字列の置換replace / 文字列の分割sprit / 文字列の一部削除strip / リストの内包表現 / 任意の範囲の等差数列 range

![Q40.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599065/99892c6a-acb8-6a51-f512-33a63cf2b14d.png)

```Python
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 


```Python
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 

```Python
import re
def solution(A):
 return dict(zip(re.findall('[a-z]+',A),[int(s) for s in re.findall('\d+', A)]))
```