1

何らかの理由で、Pythonで見つけ続けるすべての構文糖衣を考えると、次のコードは少し面倒だと感じたので、もっと良い方法があるかどうかを尋ねようと思いました。

pictures = list_of_random_pictures()
invalid_pictures = {}
for picture in pictures:
    if picture_invalid(picture):
        if not invalid_pictures.get(picture.album.id):
            invalid_pictures[picture.album.id] = []
        invalid_pictures[picture.album.id].append(picture)

明確にするために、上記の最後の3行を処理するためのより読みやすい方法があるかどうか疑問に思っています。私はinvalid_pictures[picture.album.id]3回繰り返しているので、それがまったく避けられれば、それは不必要に思えます。

編集:上記のコードがKeyErrorになることに気付いたので、それを処理するように変更しました。

4

2 に答える 2

4

実際、標準ライブラリには、その場合に正確に対処するためのオブジェクトがあります。collections.defaultdict

引数として、欠落しているキーのデフォルト値を生成する型または関数のいずれかを取ります。

from collections import defaultdict

invalid_pictures = defaultdict(list)
for picture in pictures:
    if picture_invalid(picture):
        invalid_pictures[picture.album.id].append(picture)
于 2013-03-04T03:20:51.420 に答える
2

Joelの答えは通常の解決策だと思いますが、見過ごされがちな機能があり、それが望ましい場合もあります。デフォルト値が特に望ましくない場合は、を使用することです。デフォルト値をdict.setdefault()挿入することは例外のようなものです(そしてcollections.defaultdict最適ではありません。使用setdefault()するように適合されたコードは次のようになります。

pictures = list_of_random_pictures()
invalid_pictures = {}
for picture in pictures:
    if picture_invalid(picture):
        invalid_pictures.setdefault(picture.album.id, []).append(picture)

defaultdictこれには多くの(おそらく未使用の)リストを作成するという欠点があるため、デフォルトをリストに設定する特定のケースでは、を使用してから通常のdictにコピーして、デフォルトを削除する方がよい場合がよくあります。価値。intこれは、やなどの不変型には特に当てはまりませんstr

たとえば、pep-333では、environ変数が通常dictの、のサブクラスやインスタンスでcollections.Mappingはなく、実際の単純なol'dictである必要があります。もう1つのケースは、イテレータを通過してフラットマッピングに適用するほどではない場合です。ただし、デフォルトを構成に適用する場合など、各キーには特別な処理が必要です。

于 2013-03-04T03:48:58.500 に答える