![見出し画像](https://assets.st-note.com/production/uploads/images/95180478/rectangle_large_type_2_787ae79edc2f26bf4b74c55c7793978a.png?width=1200)
Photo by
brandkojo
python: 配列の初期化を1行でやる
python 配列初期化の備忘録。お題として「0から15までの数字を、4桁二進数の文字列に変換するための配列生成」で考えてみることにします。
● 初期コード(9行)
まず素直にコーディングしてみます。配列生成に関係のある行数は9行です。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
### ここから・・・
a = []
for i in range(16):
s = ''
for b in range(4):
if i & 1 << 3-b:
s += '1'
else:
s += '0'
a.append(s)
### ・・・ここまでを書き換えてゆきます。
print(a)
これを実行すると、以下のように表示されます。この結果をキープしつつ、書き換えてゆきます。
['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
● まず(9行→6行)
場合分けで s に1文字を追加している処理を、1行にまとめました。これで6行となりました。
a = []
for i in range(16):
s = ''
for b in range(4):
s += '1' if i & 1 << 3-b else '0'
a.append(s)
● 次に(6行→4行)
ちょっと回り道をします。
文字列 s の作成はいったん、配列 a2 に1文字ずつ文字を追加して、最後に結合して得るようにしてます。これで7行に増えてしまいましたが、
a = []
for i in range(16):
a2 = []
for b in range(4):
a2.append('1' if i & 1 << 3-b else '0')
s = ''.join(a2)
a.append(s)
内部の b の繰り返し部分を1行にまとめることができるようになりました。
a = []
for i in range(16):
a2 = ['1' if i & 1 << 3-b else '0' for b in range(4)]
s = ''.join(a2)
a.append(s)
そして配列 a2 部分をまとめれば、4行となりました。
a = []
for i in range(16):
s = ''.join(['1' if i & 1 << 3-b else '0' for b in range(4)])
a.append(s)
● 最後に(4行→1行)
そして最後まで残った i の繰り返し部分をまとめると、1行にすることができました。
a = [''.join(['1' if i & 1 << 3-b else '0' for b in range(4)]) for i in range(16)]
行数は短くなったけれども、とっても見にくいですね!
最後まで読んでいただきまして、ありがとうございました!