pythonのpandasのデータフレームは表タイプのデータ処理を行うのに便利ですが、列の長さが揃っている必要があります。列の長さ(要素の数)がバラバラの場合には、辞書の配列のほうが便利ということもあるかもしれません(多分)。
‘のびた’,’すねお’, ‘しずか’,’わかめ’,’かつお’,’ドラえもん’,’しんのすけ’,’まるこ’といった人々がいたときに、彼らを3組のクラスに振り分けることを考えます。あとあとの事を考えて、辞書の配列を作成して、振り分けを行うには、どんなコードを書けばよいでしょう?
クラス数 = 3
dictlist = [dict() for x in range(クラス数)]
for i in range(クラス数):
dictlist[i] = {'氏名': []}
人びと=['のびた','すねお', 'しずか','わかめ','かつお','ドラえもん','しんのすけ','まるこ']
for k in range(len(人びと)):
dictlist[k%クラス数]['氏名'].append(人びと[k])
dictlist
上のコードを実行した結果は、
[{'氏名': ['のびた', 'わかめ', 'しんのすけ']},
{'氏名': ['すねお', 'かつお', 'まるこ']},
{'氏名': ['しずか', 'ドラえもん']}]
となり、3組に振り分けることができました。クラスの人数にばらつきがあります。
上のタスクみたいに、リストの要素に関して繰り返し処理をする場合には、リストの要素のインデックスと要素の中身そのものの両方がが欲しい場合が頻繁にあります。 その場合には、enumerateという関数が便利。上と同じ処理をenumerateを使って書けば、同じ処理が、
for k, person in enumerate(人びと):
dictlist[k%クラス数]['氏名'].append(person)
となります。
参考
- How can I create an array/list of dictionaries in python? (stackoverflow)
クラス数 = 3
dictlist = [dict() for x in range(クラス数)]
for i in range(クラス数):
dictlist[i] = {'氏名': []}
人びと=['のびた','すねお', 'しずか','わかめ','かつお','ドラえもん','しんのすけ','まるこ']
for k in range(len(人びと)):
dictlist[k%クラス数]['氏名'].append(人びと[k])
dictlist
参考
https://stackoverflow.com/questions/2397754/how-can-i-create-an-array-list-of-dictionaries-in-python