[python] いろいろな文字種のリストを作成

[~~Pythonでシンプルにアルファベットのリストを作る~~](https://gist.github.com/ikegami-yukino/4193724)（リンク切れ）に触発されて、いろいろな文字列のリストを作ってみた。

パスワードの辞書やら言葉遊びゲームで使えるのではないかなと思います。

## 追記（2018/03/30）

たまに見てくださっている方がいるようなので、コメント欄のモジュールについても説明しておきます。
半角の文字列については`string`モジュールを用いることがベストプラクティスかなと思います。

```py3
>>> import string
>>> help(string)
(中略)
DATA
    ascii_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
    ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    digits = '0123456789'
    hexdigits = '0123456789abcdefABCDEF'
    letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv...\xaf\xb0...
    lowercase = 'abcdefghijklmnopqrstuvwxyz'
    octdigits = '01234567'
    printable = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU...
    punctuation = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
    uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    whitespace = '\t\n\x0b\x0c\r '
>>> string.digits
'0123456789'
```

Pythonにおいてはリストと文字列の扱いは然程変わらないので、その部分の説明は省きます。

## アルファベット小文字

```py3
[chr(i) for i in range(97, 97+26)]
# [chr(i) for i in range(ord('a'), ord('z')+1)]
```

## アルファベット大文字

```py3
[chr(i) for i in range(65, 65+26)]
# [chr(i) for i in range(ord('A'), ord('Z')+1)]
```

## 半角数字

```py3
[chr(i) for i in range(48, 48+10)]
# [chr(i) for i in range(ord('0'), ord('9')+1)]
```

## ひらがな

```py3
[chr(i) for i in range(12353, 12436)]
# [chr(i) for i in range(ord('ぁ'), ord('ん')+1)]
```

## カタカナ

```py3
[chr(i) for i in range(12449, 12532+1)]
# [chr(i) for i in range(ord('ァ'), ord('ン')+2)]
# 「ヴ」がいらない場合は「-1」してください
```

## 全角数字

```py3
[chr(i) for i in range(65296, 65296+10)]
# [chr(i) for i in range(ord('０'), ord('９')+1)]
```

## 常用漢字

無理です。連続的には。
ただ、できないことはないです。

[常用漢字と文字コードの対応表](http://x0213.org/joyo-kanji-code/index.html)
（各文字コード版の常用漢字コード表がダウンロードできます。）
csvから漢字を抜き出してリスト化するしかないんじゃないかな・・・

コメント欄を削除した上で以下を実行。

```py3
import csv
kanji = []
with open('/path/to/joyo-kanji-code-u.csv', 'r') as f:
    data = csv.reader(f)
    
    for row in data:
        kanji.append(row[0])
```

う〜ん。
2136個のリストとか重そう・・・
表外も含んだものはご自身で頑張って作って下さい。

## 半角記号
これも連続的には無理ですね。
ASCIIを定めた人が悪い希ガス・・・
いい方法が浮かばなかったので一例を記載。

```py3
eisu = [chr(i) for i in range(97, 97+26)]
eisu.extend([chr(i) for i in range(65, 65+26)])
eisu.extend([chr(i) for i in range(48, 48+10)])

[chr(i) for i in range(33, 127) if chr(i) not in eisu]
# 因みに「33」を「32」にすると半角空白が入る
```

お気づきだとは思うが半角文字全てなら`[chr(i) for i in range(32, 127)]`

## おまけ
一個一個コピペするのは面倒だと思うので欲しいリストを返す関数を置いておきますね。
当然ながら常用漢字と半角記号はあとづけでお願いします。

```py3
# アルファベット小文字→(97, 123)
# アルファベット大文字→(65, 91)
# 半角数字→(48, 58)
# ひらがな→(12353, 12436)
# カタカナ→(12449, 12532+1)
# 全角数字→(65296, 65306)

def moji_list(*args):
    moji = []
    for i in range(len(args)):
        moji.extend([chr(j) for j in range(args[i][0], args[i][1])])
    return moji

moji_list((97, 123), (65, 91), (48, 58))
# ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
```

ord()で指定するのもありだと思いますよ。