～ 文字列 ～ チートシート

#目次
[文字列と配列の変換](#文字列と配列の変換)
　文字列を配列にする　`list()` `split("")`
　配列を文字列にする　`"".join()`
[文字と数字の変換](#文字と数字の変換)　`ord()`　`chr()`
[切り抜き](#切り抜き)　`[:]`
[置換](#置換)　`.replace('','')`
[位置を検索する](#位置を検索する)　`.find('')`
[個数を数える](#個数を数える)　`.count('')`

[連結_繰り返し](#連結_繰り返し)　`+` `*`

#はじめに

チートシートの扱いついては[ここ](https://qiita.com/ysys_Ba/items/d27282b888abbd1f43e7#%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を読んでください

#文字列と配列の変換

##文字列を配列にする

```python:string.py
str = "Hello, world!"
LIST = list(str)
print(LIST)
```

```python:出力
>>> ['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!']
```

for文で`.append(tmp)`を回してもいいけどまあこっちのほうが楽

```python:string.py
str = "Hello world !"
LIST = str.split(" ")
print(LIST)
```

```python:出力
>>> ['Hello', 'world', '!']
```

競プロではあんまり使わないかも

##配列を文字列にする

```python:string.py
LIST = ['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!']
STR = "".join(LIST)
print(STR)
```

```python:出力
>>> Hello, world!
```

[ここ](https://qiita.com/ysys_Ba/items/cf926800990160b6757c#2-%E5%87%BA%E5%8A%9B%E3%81%8C%EF%BC%91%E8%A1%8C%E3%81%A7%E8%A4%87%E6%95%B0%E3%81%AE%E5%A0%B4%E5%90%88)を参照

#文字と数字の変換

```python:string.py
print(ord("a"))
print(ord("A"))
```

```python:出力
>>> 97
>>> 65
```

文字をUnicode（文字コードの一種）に変換する

```python:string.py
print(ord("z") - ord("a"))
print(ord("J") - ord("A"))
```

```python:出力
>>> 25
>>> 9
```

最初っぽい文字と差を取ることで扱いやすくなる

```python:string.py
print(chr(65))
print(chr(97))
```

```python:出力
>>> A
>>> a
```

Unicode（文字コードの一種）を文字に変換する

```python:string.py
print(chr(25 + ord('a')))
print(chr(9 + ord('A')))
```

```python:出力
>>> z
>>> J
```

最初っぽい文字と差を取ることで扱いやすくなる

#切り抜き

```python:string.py
#      0123456789...
str = "Hello, world!"
print(str[5])
print(str[-1])
print(str[4:8])
print(str[:6])
print(str[7:])
```

```python:出力
>>> ,
>>> !
>>> o, w
>>> Hello,
>>> world!
```

`:`の前の引数「から」、後の引数「**の１つ前まで**」の部分を切り取る
引数に`-1`を指定すると最後の文字として扱われる（-2以降も同様に後からカウント）
ここまでは自明扱いしてページの後ろに回したい...

#置換

```python:string.py
str = "1145141919"
print(str.replace("1","*"))
print(str.replace("1","*",3))
```

```python:出力
>>> **45*4*9*9
>>> **45*41919
```

第１引数に置換する部分の置換前の文字列を、第２引数に置換後の文字列を入れると文字列内の指定の文字を全て置換する
第３引数で前から何個目まで置換するかを指定できる

```python:string.py
#      0123456789...
str = "Hello, world!"
print(str[:7] + "W" + str[8:])
```

```python:出力
>>> Hello, World!
```

特定の位置の文字列だけ変えたいならば、切り抜きと連結を組み合わせるのがよさそう（少し調べたけど良さげなのが出てこなかった）

#位置を検索する

```python:string.py
#      0123456789
str = "1145141919"
print(str.find('4'))
print(str.find('14'))
print(str.find('4', 6))
```

```python:出力
>>> 2
>>> 1
>>> -1
```

前から順番に指定された文字列（つまり複数文字でもOK）があるかを検索し、あったらその場所を出力する（最後までなかったら`-1`を出力する）
第2引数で検索を始める位置を指定し、途中から検索できる

```python:string.py
#      0123456789
str = "1145141919"
target = '1'
tmp = -1
mat = []
while True:
  tmp = str.find(target, tmp + 1)
  if tmp == -1:
    break
  mat.append(tmp)
print(mat)
```

```python:出力
>>> [0, 1, 4, 6, 8]
```

最初の１つ（含まれているかどうか）だけでなく、文字列内の全てを検索して結果を出力するコード

#個数を数える

```python:string.py
#      0123456789
str = "1145141919"
print(str.count("1"))
```

```python:出力
>>> 5
```

１つ前のコードみたいに`.find('')`をwhileで回してもいいけど、こっちのほうが楽

#連結_繰り返し

```python:string.py
print("ysys"+"_"+"Ba")
print("ys" * 2)
```

```python:出力
>>> ysys_Ba
>>> ysys
```

結構直観的（intだと思ってたものがstrだと演算が変わる）