目次
次のような Python ディクショナリ型 の値をスプレッドシートに表の形で記述することを考えます。
1 2 3 4 5 |
pattern = { 'エリア': ['日本', 'アメリカ', 'イギリス'], '性別': ['男', '女'], '身長': ['100cm以上', '100cm未満'] } |
環境
- Python 3.7.6
- Linux
掛け合わせ表の作成 (直積)
スプレッドシートで次のような各要素を掛け合わせた表を作ります。
エリア | 性別 | 身長 | |
---|---|---|---|
1 | 日本 | 男 | 100cm以上 |
2 | 日本 | 男 | 100cm未満 |
3 | 日本 | 女 | 100cm以上 |
4 | 日本 | 女 | 100cm未満 |
5 | アメリカ | 男 | 100cm以上 |
6 | アメリカ | 男 | 100cm未満 |
7 | アメリカ | 女 | 100cm以上 |
8 | アメリカ | 女 | 100cm未満 |
9 | イギリス | 男 | 100cm以上 |
10 | イギリス | 男 | 100cm未満 |
11 | イギリス | 女 | 100cm以上 |
12 | イギリス | 女 | 100cm未満 |
Python で次のように書くと、カンマ区切りのものが出力されます。
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) |
それをスプレッドシートに貼り付けるとうまい具合に表ができます。
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未満 |
補足
itertools.product
を使って、 複数のリストの掛け合わせを作っています。 この関数は可変長引数ですから、*pattern.values()
と書いてリストを展開する書き方にしています。for
の中で使うi
はemumerate
を使って作ることもできます。 次のコードではenumerate
を使っています。
分類項目表の作成
上の掛け合わせ表の各項目とその値について次のような表を作りたい場合
項目 | 値 |
---|---|
エリア | 日本 |
アメリカ | |
イギリス | |
性別 | 男 |
女 | |
身長 | 100cm以上 |
100cm未満 |
Python で次のように書くと、カンマ区切りのものが出力されます。
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) |
それをスプレッドシートに貼り付けるとうまい具合に表ができます。
1 2 3 4 5 6 7 |
エリア,日本 ,アメリカ ,イギリス 性別,男 ,女 身長,100cm以上 ,100cm未満 |
まとめたコード
これを対話型で進められるひとつのPythonファイルにすると次のようになります。
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 71 |
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 delimiter [,]: """) delimiter = get_input(',') print(f""" prefix: """) prefix = get_input() print(f""" suffix: """) 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未満'] } print_pattern: int = None while True: print(""" Print dict structure. Enter print pattern: 1. Product table 2. Category key-value """) print_pattern = int(get_input()) if print_pattern in [1, 2]: break; 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) |