ChatGPTに関心した話
お久しぶりです。
猫も杓子もGPTですね。
自分も例に漏れず使っているわけですが関心したことがあったのでまとめてみようかなと思いました
動機
pythonを最近よく書くのである程度詳しい認識はあるのですが、
dictを加算しつつ結合するようなメソッドが欲しいと思いました。
dictを結合する場合 |
演算子や update()
メソッドを用いることがよく知られていますが、それらはこのように動作します
In [2]: _d1 = {1:2, 2:3} In [3]: _d1.update({3:4}) In [4]: _d1 Out[4]: {1: 2, 2: 3, 3: 4} In [5]: {1:2, 2:3} | {3:4} Out[5]: {1: 2, 2: 3, 3: 4}
これらはキーが重複していない状態では想定通りの挙動をしますが、キーがかぶっているときには安全側に倒すような挙動となります(エラーなどでずに後ろの値で上書き)
キーが重複していたときに加算してほしいなあと思ったのですがそういった実装はないのでChatGPTに聞いてみることにしました
聞いてみた
解説
だいたいコメントを読んでもらうと想定内のことが書いてありますね
なんで copy()
が入っているのかというと、primitive typeを除いてpythonでは引数に参照渡しでくるのでそのまま copy()
せずに代入すると引数で渡したp1の値が関数の外で想定外の値になってしまうからです
だいたいのケースでcopyせずに問題なく動くと思いますがあるとなしでは安全さが違う
これらを受けてこういうコードになった
T = TypeVar("T") def merge_dict(src: dict[T, int], *args: Any) -> dict[T, int]: dest = src.copy() for arg in args: for k, v in arg.items(): if k in dest: dest[k] += v else: dest[k] = v return dest
こういう感じにすることで
merge_dict({1: 2, 3:4}, {3:5}, {1: 8})
みたいな書き方でもちゃんと結合させることが可能