見出し画像

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)]

行数は短くなったけれども、とっても見にくいですね!


最後まで読んでいただきまして、ありがとうございました!