次の2つの式は私と同じように見えます。どちらが望ましいですか?
data = [('a', 1), ('b', 1), ('b', 2)]
d1 = {}
d2 = {}
for key, val in data:
# variant 1)
d1[key] = d1.get(key, []) + [val]
# variant 2)
d2.setdefault(key, []).append(val)
結果は同じですが、どちらのバージョンがより優れているのでしょうか、それともよりPython的ですか?
個人的には、バージョン2を理解するのは難しいと思います。私にとって、setdefaultは理解するのが非常に難しいためです。私が正しく理解していれば、辞書で「key」の値を探します。使用できない場合は、dictに「[]」を入力し、値または「[]」への参照を返し、それに「val」を追加します参照。確かにスムーズですが、少なくとも(少なくとも私にとっては)直感的ではありません。
私の考えでは、バージョン1の方が理解しやすいです(利用可能な場合は「key」の値を取得し、そうでない場合は「[]」を取得してから、[val]で構成されるリストに参加し、結果を「key」に配置します。 )。しかし、より直感的に理解できますが、このバージョンではパフォーマンスが低下し、このすべてのリストが作成されるのではないかと心配しています。もう1つの欠点は、「d1」が式で2回発生することです。これは、エラーが発生しやすいことです。おそらくgetを使用したより良い実装がありますが、現在それは私にはわかりません。
私の推測では、バージョン2は、経験の浅い人にとっては理解するのが難しいですが、より高速であり、したがって好ましいと思います。意見?