1

短縮版:

Pythonでは、「オブジェクトのこれらの5つ(またはいくつでも)のプロパティを辞書として、他には何も与えないでください」と(きれいに/エレガントに)言う方法はありますか?

長いバージョン:

Javascript Underscoreライブラリを使用すると、オブジェクト/辞書の束(JSでは同じものです)を次のようにプロパティのサブセットの束に減らすことができます。

var subsets = _(someObjects).map(function(someObject) {
    _(someObject).pick(['a', 'd']);
});

Pythonオブジェクト(辞書ではない)で同じことをしたい場合でも、リスト内包表記を使用して各プロパティを手動で設定するのが最善のようです。

subsets = [{"a": x.a, "d": x.d} for x in someObjects]

プロパティが2つしかない場合はそれほど悪くはなく、両方とも1文字ですが、プロパティを増やしたり長くしたりすると、処理が速くなります(さらに、複数行のリスト内包表記を作成するたびに気分が悪くなります)。すべてをforループを使用する関数に変換することもできますが、その前に、JSよりもクリーンに(またはさらにクリーンに)これを実行するために使用できるクールな組み込みのPythonユーティリティがありますか?バージョン?

4

2 に答える 2

3

これは、リスト内包と辞書内包を組み合わせることで簡単に実行できます。

subsets = [{attr: getattr(x, attr) for attr in ["a", "d"]} 
           for x in someObjects]

当然のことながら、次のことを行う場合は、その理解を引き出すことができます。

def pick(*attrs):
    return {attr: getattr(x, attr) for attr in attrs} 

subsets = [pick("a", "d") for x in someObjects]
于 2013-01-03T01:02:35.363 に答える
0
>>> A = ['a', 'c']
>>> O = [{'a': 1, 'b': 2, 'c': 3}, {'a': 11, 'b': 22, 'c': 33, 'd': 44}]

>>> [{a: o[a] for a in A} for o in O]
[{'a': 1, 'c': 3}, {'a': 11, 'c': 33}]

>>> list(map(lambda o: {a: o[a] for a in A}, O))
[{'a': 1, 'c': 3}, {'a': 11, 'c': 33}]
于 2020-07-15T14:27:26.157 に答える