009.Pythonの辞書の初期化2
初回:2018/10/03
0.今回のまとめ
dict(辞書型)の初期化について、検討してみます。 辞書型の変数に値を設定する方法を探っていきたいと思います。 また、collections の defaultdict を利用したキーのない値に対する 取り扱いも検討します。
1.今までの反省
前回は、コラム色を強めていくと宣言しましたが、ちっともコラムになってませんでした。 それを反省して、出来ないことはしない、ということで、言語解説書的な、文章の回と 文章のみでコラムの回を、別けたいと思います。 今回は、前回の続きなので、言語解説書的な回です。
「なんだかんだ理由を付けてるけど、言い訳ばっかり」(※1)
「いい若けえもんが、言い訳してるんじゃねえよ。」って、言いたいの?
「あなたって、もう、若くないでしょ。」
2.辞書型の初期化
前回は、空の辞書を作成して、値の取得時に、None の場合の初期値を返す 方法でした。 今回は、辞書そのものにデータをセットしたり、追加する方法です。
辞書型にデータを登録する場合の、一般的な方法というと。
>>> x = { 'a':10 , 'b':20 }
>>> print(x)
{'a': 10, 'b': 20}
>>>
それぞれの値に、+1 します。
>>> for key in x.keys():
>>> x[key] += 1
>>>
>>> print(x)
{'a': 11, 'b': 21}
>>>
存在しないキーで、値を更新しようとすると、エラーになります。 その場合は、キーの存在チェックを行ってから、初期化を行い、+1 します。
>>> keyList=['a','b','c']
>>> x = { 'a':10 , 'b':20 }
>>> for key in keyList:
>>> if( key not in x):
>>> x[key]=0
>>> x[key] += 1
>>>
>>> print(x)
{'a': 11, 'b': 21, 'c': 1}
>>>
「よく、判んない」(※2)
あまり、条件判定で、処理を判りにくくしたくない場合、defaultdict という dict の初期化を関数にしたがって実施する事ができるクラスがあります。(※3)
>>> from collections import defaultdict
>>> keyList=['a','b','c']
>>> x = defaultdict( int , { 'a':10 , 'b':20 } )
>>> for key in keyList:
>>> x[key] += 1
>>>
>>> print(x)
defaultdict(<class 'int'>, {'a': 11, 'b': 21, 'c': 1})
>>>
defaultdict の引数には、「初期化時に実行する関数」を記述します。 「int」と記述した場合「lambda: int()」と同じ意味で、「int()」 は 「0」を返しますので、これは「lambda: 0」と同じ動作になります。(※4)
通常の辞書に変換するには、dict の引数に渡します。
>>> y=dict(x)
>>> print(y)
{'a': 11, 'b': 21, 'c': 1}
>>>
リストの場合は、リスト内包表記で、一括作成できます。 小文字の 'a' ~ 'n'(含まず) までのリストを作成します。
>>> y=[chr(i) for i in range(ord('a'),ord('n'))]
>>> print(y)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm']
>>>
同様に、辞書の内包表記で、初期値を設定してみます。
>>> x={chr(i):0 for i in range(ord('a'),ord('n'))}
>>> print(x)
{'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0, 'g': 0, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 0, 'm': 0}
>>>
当然、こういうことも可能です。
>>> x={i-ord('a'):chr(i) for i in range(ord('a'),ord('n'))}
>>> print(x)
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm'}
>>>
「もう、帰るわね」(※5)
最後にもう一つ。 内包表記で、条件判断も使えます。 でも、辞書の初期作成では、あまり使わないかも。
>>> x={i-ord('a'):chr(i) for i in range(ord('a'),ord('n')) if i % 2 == 0} >>> print(x)
{1: 'b', 3: 'd', 5: 'f', 7: 'h', 9: 'j', 11: 'l'}
>>>
「ほな、さいなら」(※6)
======= <<注釈>>=======
※1 「なんだかんだ理由を付けてるけど、言い訳ばっかり」
前回のパターンに味を占めて、どこからでも口出ししてきます。
※2 「よく、判んない」
ちょっと、退屈してきたみたいです。
※3 defaultdict の詳しい説明は、以下のURLを参照しています。
https://qiita.com/xza/items/72a1b07fcf64d1f4bdb7
※5 「もう、帰るわね」
だいぶ、退屈してきたみたいです。相当まずい状態です。
※6 「ほな、さいなら」
日常会話では、ほとんど聞くことがなくなりました。吉本新喜劇くらい? でも、ちょっと、改まった感じで、冗談めかして言った場合は、 かわいく見えます。
コメント
shiracamus
> 今回は、前回の続きなので、言語解説書的な回です。
タイトルが「辞書の初期化」なので、、辞書の作り方のバリエーションを紹介しているのかと思ったら、「辞書の加工方法」の話だったのですね。
書かれていない初期化方法をいくつか・・・
>>> dict((('a', 12), ('b', 22), ('c', 2)))
{'a': 12, 'b': 22, 'c': 2}
>>> dict(a=13, b=23, c=3)
{'a': 13, 'b': 23, 'c': 3}
ちゃとらん
コメントありがとうございます。
タイトルで、つまづくなんて、まだまだですね。
イメージ的には、辞書を作る場合(これを、私は初期化と言ってました)空の辞書を作成して、そこに、値を設定していくより、いきなり、値の設定された辞書を、用意したい、という思惑があり、初期化と加工方法が、ごちゃまぜに、なっちゃったんですね。きっと。
>>> dict(a=13, b=23, c=3)
は、いい感じの初期化で、辞書って感じですが、
>>> dict((('a', 12), ('b', 22), ('c', 2)))
って、2要素のタプルのタプルで、初期化って、すごい文法ですね。
「なんか、文句あるの?」
いえ、ございません。