43912


辞書のvalueが２つ以上の要素を持っているかどうか知りたいです。  
今、

[code]

    df = {"A": {"a1": 0.5}} #1
    df = {"A": {"e1": 1.6, "f1": 2.0}} #2
    df = {"A": {"b1": 1.0, "c1": 1.5, "d1": 1.9}} #3
    
[/code]

という辞書が３つあります。  
valueが１つ（例えば、`{"A": {"a1": 0.5}}`）なら、if文の中でAの処理をし、  
valueが２つ以上（例えば、`{"A": {"e1": 1.6, "f1": 2.0}}`・`{"A": {"b1": 1.0, "c1": 1.5,
"d1": 1.9}}`）なら、if文の中でBの処理をする、という流れにしたいです。

[code]

    if len(df.values()) != 1:
       B(df)
    else:
       A(df)
    
[/code]

とコードを書いたのですが、#1の辞書も#2・#3の辞書もどちらもdf.values()が１であると判定されてしまいます。  
どのように判定できますか？


CC BY-SA 4.0
2018-05-11T05:34:53.127
43910
2018-05-11T06:37:07.627
2018-05-11T05:53:20.707
3068
28481
question
python
辞書のvalueが２つ以上の要素を持つオブジェクトかどうか知りたい


**全て1だと判定される原因**  
全てのvalues()は、以下のように取得されてしまいます。

[code]

    df = {"A": {"b1": 1.0, "c1": 1.5, "d1": 1.9}}
    df.values()
    >dict_values([{'b1': 1.0, 'c1': 1.5, 'd1': 1.9}])
    
    len(df.values())
    >1
    
[/code]

結局、全部長さが1だからです。  
なぜ、この長さが全部１かというと、dfの値が一つのディクショナリだと判定されるからです。

**仮定 もし値をもう一つ増やすと**

[code]

    df = {"A": {"b1": 1.0, "c1": 1.5, "d1": 1.9},"B":{"b1": 1.0, "c1": 1.5, "d1": 1.9}}
    
    In [19]:len(df.values())
    Out[19]: 2
    
[/code]

この場合は、2つのディクショナリがあるので、2とカウントされます。  
pypyさんの書いた`df = {"A": {"b1": 1.0, "c1": 1.5, "d1": 1.9}}`だと、  
`df`の中には、一つのディクショナリしかないからです。`df`には"A"というキーが入っており、その値として、 {"b1": 1.0, "c1":
1.5, "d1": 1.9}が入れられているんだけれども、df.values()の長さを調べようとすると、{"b1": 1.0, "c1": 1.5,
"d1": 1.9}というdict型の値が一つ入っているとカウントされています。  
なので、`{"b1": 1.0, "c1": 1.5, "d1":
1.9}`の長さを調べたいというのであれば、`df.values()`の長さではなく、`"A"`というキーで指定された値の長さを調べなくてはなりません。  
おそらく、されようとしているのはそうしたことでしょうから、`key`を指定してあげるといいです。

[code]

    In [10]:df["A"]
    Out[10]: {'b1': 1.0, 'c1': 1.5, 'd1': 1.9}
    
    In [10]:len(df["A"])
    Out[11]: 3
    
[/code]

**提案**  
よって、

[code]

    if len(df["A"]) != 1:
       B(df)
    else:
       A(df)
    
[/code]

がいいんじゃないでしょうか。


CC BY-SA 4.0
2018-05-11T06:19:13.673
43912
2018-05-11T06:37:07.627
2018-05-11T06:37:07.627
24284
24284
43910
answer