2017-04-13 10 views
0

dictcompelseのステートメントを使用することはできますか?if-elseを辞書の理解

thisを参照)を理解自体の一部としてelseを使用することは不可能であるが、少なくともlistset内包においては(this参照)conditional_expressionを使用することが可能です。

listcompの例はhereです。

私のコード例は次のとおりです。

converters = {"id": int} 
rows = [{"id": "1", "name": "foo"}, {"id": "2", "name": "bar"}] 
for row in rows: 
    row = {k: converters[k](v) if k in converters else k:v for k,v in row.items()} 
    print(row) 

これは動作しません。

奇妙な部分は、それがOKであるべきにもかかわらず

row = {k: converters[k](v) if k in converters for k, v in row.items()}は、いずれかの動作しないということです。

row = {k: converters[k](v) for k, v in row.items() if k in converters}が動作しますが、これは私が望む結果ではありません。私が上で指摘したように、
row = {k: converters[k](v) for k, v in row.items() if k in converters else k:v}は機能しません。

私は2つのdictcompsを使用して問題を回避できることを知っていますが、なぜこれが機能しないのかを知りたいのです。

答えて

3

条件は、辞書の値のためではなく、キーと値のペアに適用されるため、それは次のように評価され、すなわちです:

row = {k: (converters[k](v) if k in converters else k:v) for k,v in row.items()} 

k:vが、ここで構文的に有効ではありません、それはペアの内部でのみ有効ですかっこの中か関数の署名の中に入れることができます(したがって、k:vを角かっこに入れてSyntaxErrorを修正すると、結果が変わります)。

溶液は、それが変化するものであるため、単純条件の値を供給することである。

row = dict((k, converters[k](v)) if k in converters else (k,v) for k,v in row.items()) 

row = {k: converters[k](v) if k in converters else v for k,v in row.items()} 

別のオプションは、もちろん、代わりdictコンストラクタにタプルを供給することです