[Unicode] 部首⇄CJK統合漢字10進値の相互呼び出しをやってみた

#ⵙⵓはじめに
ハードコア抽象文學者の__[kammultica](https://twitter.com/kammulticae)__です．
現在，人工言語を開発しております．中間生成物を上げていきます．

__使用言語：Python 3.6.5__
__最終目的：人工言語の運転__
※人工言語自体のコンセプトは[ブログ](https://spinaltox.hatenablog.jp/entry/2018/10/21/112623)，根本のコンセプトは[自サイト](https://spinaltox.net)参照のこと．

---

#ⵞⵓ部首空間

[前回](https://qiita.com/kammultica/items/1e2e0113a2d746e6f9cf)は下準備として，部首名を変数名として，対応するCJK統合漢字の10進数値を要素として配列を作成しました．今回は，これらを辞書型にする部首空間の作成をおこないます．(本稿における「部首空間」とは，キーとして部首名(一, 丨, 丶……)を，要素として当該部首中のCJK統合漢字群をもつ辞書を指します)

まずは前回の配列群を2次元配列にまとめます．これは部首空間の要素となります．

```py
部首 = [一, 丨, 丶, 丿, 乙, 亅, 二, 亠, 人, 儿, 入, 八, 冂, 冖, 冫, 几, 凵, 刀, 力, 勹, 匕, 匚, 匸, 十,卜,\
       卩, 厂, 厶, 又, 口, 囗, 土, 士, 夂, 夊, 夕, 大, 女, 子, 宀, 寸, 小, 尢, 尸, 屮, 山, 巛, 工, 己, 巾,\
       干, 幺, 广, 廴, 廾, 弋, 弓, 彐, 彡, 彳, 心, 戈, 戶, 手, 支, 攴, 文, 斗, 斤, 方, 无, 日, 曰, 月, 木,\
       欠, 止, 歹, 殳, 毋, 比, 毛, 氏, 气, 水, 火, 爪, 父, 爻, 爿, 片, 牙, 牛, 犬, 玄, 玉, 瓜, 瓦, 甘, 生,\
       用, 田, 疋, 疒, 癶, 白, 皮, 皿, 目, 矛, 矢, 石, 示, 禸, 禾, 穴, 立, 竹, 米, 糸, 缶, 网, 羊, 羽, 老,\
       而, 耒, 耳, 聿, 肉, 臣, 自, 至, 臼, 舌, 舛, 舟, 艮, 色, 艸, 虍, 虫, 血, 行, 衣, 襾, 見, 角, 言, 谷,\
       豆, 豕, 豸, 貝, 赤, 走, 足, 身, 車, 辛, 辰, 辵, 邑, 酉, 釆, 里, 金, 長, 門, 阜, 隶, 隹, 雨, 靑, 非,\
       面, 革, 韋, 韭, 音, 頁, 風, 飛, 食, 首, 香, 馬, 骨, 高, 髟, 鬥, 鬯, 鬲, 鬼, 魚, 鳥, 鹵, 鹿, 麥, 麻,\
       黃, 黍, 黑, 黹, 黽, 鼎, 鼓, 鼠, 鼻, 齊, 齒, 龍, 龜, 龠, 他]
```

次に，キー値となる部首名を文字列の配列で定義します．

```py
部首名 = ['一', '丨', '丶', '丿', '乙', '亅', '二', '亠', '人', '儿', '入', '八', '冂', '冖', '冫', '几',\
         '凵', '刀', '力', '勹', '匕', '匚', '匸', '十', '卜', '卩', '厂', '厶', '又', '口', '囗', '土',\
         '士', '夂', '夊', '夕', '大', '女', '子', '宀', '寸', '小', '尢', '尸', '屮', '山', '巛', '工',\
         '己', '巾', '干', '幺', '广', '廴', '廾', '弋', '弓', '彐', '彡', '彳', '心', '戈', '戶', '手',\
         '支', '攴', '文', '斗', '斤', '方', '无', '日', '曰', '月', '木', '欠', '止', '歹', '殳', '毋',\
         '比', '毛', '氏', '气', '水', '火', '爪', '父', '爻', '爿', '片', '牙', '牛', '犬', '玄', '玉',\
         '瓜', '瓦', '甘', '生', '用', '田', '疋', '疒', '癶', '白', '皮', '皿', '目', '矛', '矢', '石',\
         '示', '禸', '禾', '穴', '立', '竹', '米', '糸', '缶', '网', '羊', '羽', '老', '而', '耒', '耳',\
         '聿', '肉', '臣', '自', '至', '臼', '舌', '舛', '舟', '艮', '色', '艸', '虍', '虫', '血', '行',\
         '衣', '襾', '見', '角', '言', '谷', '豆', '豕', '豸', '貝', '赤', '走', '足', '身', '車', '辛',\
         '辰', '辵', '邑', '酉', '釆', '里', '金', '長', '門', '阜', '隶', '隹', '雨', '靑', '非', '面',\
         '革', '韋', '韭', '音', '頁', '風', '飛', '食', '首', '香', '馬', '骨', '高', '髟', '鬥', '鬯',\
         '鬲', '鬼', '魚', '鳥', '鹵', '鹿', '麥', '麻', '黃', '黍', '黑', '黹', '黽', '鼎', '鼓', '鼠',\
         '鼻', '齊', '齒', '龍', '龜', '龠', '他']

```

上2つの配列より，以下のように部首空間が定義できます．

```py
部首空間 = dict(zip(部首名, 部首))

''' print(部首空間)
{'一': [19968, 19969, 19970, 19971, 19972, 19973, 19974, 19975, 19976, 19977,
19978, 19979, 19980, 19981, 19982, 19983, 19984, 19985, 19986, 19987, 19988, 
19989, 19990, 19991, 19992, 19993, 19994, 19995, 19996, 19997, 19998, 19999, 
20000, 20001, 20002, 20003, 20004, 20005, 20006, 20007], '丨': [20008, 20009, 
20010, 20011, 20012, 20013, 20014, 20015, 20016, 20017, 20018, 20019, 20020, 
20021], '丶': [20022, 20023, 20024, 20025, 20026, 20027, 20028, 20029, 20030],
……
'''
```

以上の定義から，任意の部首をもつ漢字を呼び出すことが可能になりました．続いて，任意の漢字(10進値)から部首を割り出す，いわゆる「逆引き」の関数を定義します．

```py
def 部首検索(self, number): # 10進数値入力 → 当該部首
        for 配列取出 in 部首空間.values():
            if(number in 配列取出):
                for name, group in 部首空間.items():
                    if group == 配列取出:
                        return name
                        break
                else: # 内部ループでbreakされないかぎり続行。高速動作してる...はず。
                    continue
                break
```

##ⵒⵓ蛇足
逆引きに関して，下のような方法で検索することもできます．が，固有の漢字に対応する部首(キー値)は1つだけであるため，計算時間で劣ります．とはいえ，応用の余地があるため残しておきます．

```py
[key for key, values in 部首空間.items() if 30866 in values][0]
```