ディクショナリの要素をランダムにシャッフルする

開発環境は、Windows7 Professional(32bit) + Python 2.7.10.12。

Pythonのディクショナリをリストみたいに、シャッフルしたいと思ったので書いてみました。といっても、単に、ディクショナリのキーを昇順の数値にして、リストを新しく作り、シャッフルして、それを順番に読み込んでいるだけです。

まず、本題に入る前に、ディクショナリの傾向を書いていきます。
ディクショナリは、キーが数値だと順番通りに並ぶけれど、キーが文字列になると、順番がバラバラになります。バラバラといっても、ランダムではなく、1桁は1桁でまとまり、2桁は2桁でまとまるバラバラです。これに納得がいかないので、ランダムにシャッフルする方法はないかと考えました。

# -*- coding:utf-8 -*-

dic = {}
dic2 = {}

for i in range(30):
	dic[i] = "test" + str(i)
for i in range(30):
	dic2[str(i)] = "test" + str(i)

dicの結果
f:id:k01ken:20171226173055p:plain
dic2の結果
f:id:k01ken:20171226173109p:plain

# -*- conding:utf-8 -*-

import random

dic = {}

for i in range(30):
	dic[i] = "test" + str(i)

r = range(30)
random.shuffle(r)

for j in range(len(r)):
	print dic[r[j]]

結果は下のような感じになります。
f:id:k01ken:20171225190415p:plain

プログラミングをする上での自分なりのちょっとしたコツですが、作りたいテーマが決まって、いきなりソースコードを書こうとするとどういう構造になっているのか分からずに、嫌になって、手が止まったり、やめたりするけれど、メモじゃなくて、目を閉じて、頭の中で構造を"想像"して、どういう関数を使えば実現できるかソースコードに置き換えてから、実際に、ソースコードを書き出すと、一気に書き上げることができました。

先ほど、メモじゃなくて頭の中でと書きましたが、人間は頭の中で想像したことを実現しようとする傾向があると思うんです。つまり、最後までやり遂げようとする原動力が想像の効果の1つだと思います。これは、プログラミングだけじゃなくて、何かをやろうとする前に、やっている自分を具体的にイメージする行為を1回入れることによって、やる確率が実際に高まると経験上思います。だから、僕は、メモよりも頭の中の想像を、これからも用いようと思います。