目次
仕事をしているといろんなものを分類していくことがあります。 そんなとき、分類表を作ることがあるのですが、いちいちテキスト入力で作っていくのはだいぶ骨の折れる作業です。 ここではそんな分類表と分類項目一覧を Python で出力するコードを紹介します。 (ちょうど Python で作業していたので Python で書きました。)
前提
たとえば、なにかを次のカテゴリで分けたいとします。
1 2 3 4 5 6 7 8 9 10 |
|--- エリア | |--- 日本 | |--- アメリカ | `--- イギリス |--- 性別 | |--- 男性 | `--- 女性 `--- 身長 |--- 100cm以上 `--- 100cm未満 |
この分類表は次のようになります。
エリア | 性別 | 身長 | |
---|---|---|---|
1 | 日本 | 男 | 100cm以上 |
2 | 日本 | 男 | 100cm未満 |
3 | 日本 | 女 | 100cm以上 |
4 | 日本 | 女 | 100cm未満 |
5 | アメリカ | 男 | 100cm以上 |
6 | アメリカ | 男 | 100cm未満 |
7 | アメリカ | 女 | 100cm以上 |
8 | アメリカ | 女 | 100cm未満 |
9 | イギリス | 男 | 100cm以上 |
10 | イギリス | 男 | 100cm未満 |
11 | イギリス | 女 | 100cm以上 |
12 | イギリス | 女 | 100cm未満 |
分類一覧は次のようになります。
項目 | 値 |
---|---|
エリア | 日本 |
アメリカ | |
イギリス | |
性別 | 男 |
女 | |
身長 | 100cm以上 |
100cm未満 |
まだ分類項目が少ないからテキストを入力してもなんとかなりますが、増えてくると幾何級数的にやることが増えます。 これを Python でやってみます。 CSVとして出力し、それをコピー&ペーストでスプレッドシートに貼り付けます。
まず今回の分類を Python で表現します。
1 2 3 4 5 |
pattern = { 'エリア': ['日本', 'アメリカ', 'イギリス'], '性別': ['男', '女'], '身長': ['100cm以上', '100cm未満'] } |
これを使って分類一覧と掛け合わせ表を作ります。
分類一覧を作りたい場合
Python で次のように書くと、 CSV形式で出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if __name__ == '__main__': pattern = { 'エリア': ['日本', 'アメリカ', 'イギリス'], '性別': ['男', '女'], '身長': ['100cm以上', '100cm未満'] } delimiter = ',' result = '' for key, value in pattern.items(): for index, item in enumerate(value): if index == 0: result += key result += delimiter + item + '\n' print(result) |
Output
1 2 3 4 5 6 7 |
エリア,日本 ,アメリカ ,イギリス 性別,男 ,女 身長,100cm以上 ,100cm未満 |
これをスプレッドシートに貼り付けると、うまい具合に表ができます。
分類表 (直積、掛け合わせ表) を表示する
Python で次のように書くと、 CSV形式で出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from itertools import product if __name__ == '__main__': pattern = { 'エリア': ['日本', 'アメリカ', 'イギリス'], '性別': ['男', '女'], '身長': ['100cm以上', '100cm未満'] } delimiter = ',' result = delimiter + delimiter.join(pattern.keys()) + '\n' i = 0 for item in product(*pattern.values()): i += 1 result += str(i) + delimiter + delimiter.join(item) + '\n' print(result) |
itertools.product
を使って直積を簡潔に作成しています。 i
は出力する番号として1ずつ加算しています。
Output
1 2 3 4 5 6 7 8 9 10 11 12 13 |
,エリア,性別,身長 1,日本,男,100cm以上 2,日本,男,100cm未満 3,日本,女,100cm以上 4,日本,女,100cm未満 5,アメリカ,男,100cm以上 6,アメリカ,男,100cm未満 7,アメリカ,女,100cm以上 8,アメリカ,女,100cm未満 9,イギリス,男,100cm以上 10,イギリス,男,100cm未満 11,イギリス,女,100cm以上 12,イギリス,女,100cm未満 |
これをスプレッドシートに貼り付けると、うまい具合に表ができます。
まとめたコード
上記のコードをまとめて対話型で実行できるようにすると次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
from itertools import product def get_input(default: str = ''): value: str = input().rstrip("\n") if value: return value return default def configure(): print("Please configure") print(" delimiter [,]: ", end='') delimiter = get_input(',') print(" prefix: ", end='') prefix = get_input() print(" suffix: ", end='') suffix = get_input() return delimiter, prefix, suffix def print_product_table(pattern: dict, delimiter: str, prefix: str, suffix: str): result = prefix + delimiter + delimiter.join(pattern.keys()) + suffix + '\n' i = 0 for item in product(*pattern.values()): i += 1 result += prefix + str(i) + delimiter + delimiter.join(item) + suffix + '\n' print(result) def print_category_key_value(pattern, delimiter, prefix, suffix): result = '' for key, value in pattern.items(): for index, item in enumerate(value): line = prefix if index == 0: line += key line += delimiter + item + suffix result += line.strip() + '\n' print(result) if __name__ == '__main__': pattern = { 'エリア': ['日本', 'アメリカ', 'イギリス'], '性別': ['男', '女'], '身長': ['100cm以上', '100cm未満'] } while True: print_pattern: int while True: print(""" Print dict structure. Enter print pattern: 1. Product table 2. Category key-value To exit, type only enter: """, end='') print_pattern = int(get_input() or 0) if print_pattern in [1, 2]: break elif not print_pattern: exit(0) delimiter, prefix, suffix = configure() if print_pattern == 1: print_product_table(pattern, delimiter, prefix, suffix) elif print_pattern == 2: print_category_key_value(pattern, delimiter, prefix, suffix) |
これを実行すると対話型で表を出力することができます。 区切り文字等を設定することができ、 prefix, suffix を設定することで Markdown の表を作ることもできます。
Output Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Print dict structure. Enter print pattern: 1. Product table 2. Category key-value To exit, type only enter. (base) root@374ac3e57a4f:/project/word# python test/pattern.py Print dict structure. Enter print pattern: 1. Product table 2. Category key-value To exit, type only enter: 2 Please configure delimiter [,]: | prefix: | suffix: | | エリア | 日本 | | | アメリカ | | | イギリス | | 性別 | 男 | | | 女 | | 身長 | 100cm以上 | | | 100cm未満 | |