2016-06-30 6 views
1

私はこのようなJSONファイルを持っています。 python - 辞書の2番目と3番目の最大値を持つキーを取得

{ 
"b0:47:bf:af:c1:42": 
{ 
"No. of visits": 10, "cities": 
    { 
     "Mumbai": {"count": 5,"last_visited": "5/22/2016"}, 
     "Kolkata": {"count": 2,"last_visited": "5/22/2016"}, 
     "Amritsar":{"count": 3,"last_visited": "5/22/2016"} 
    } 
}, 
"c0:ee:fb:71:be:0d": 
{ 
"No. of visits": 24, "cities": 
{ 
    "Mumbai": {"count": 2,"last_visited": "5/22/2016"}, 
    "Kolkata": {"count": 20,"last_visited": "5/22/2016"}, 
    "Amritsar":{"count": 2,"last_visited": "5/22/2016"} 
} 
} 
} 

は今、ユーザーまたは私は現在、辞書にそれを解析して、これを使用していた各キーのキー b0:47:bf:af:c1:42で街を訪れた最大を取得します。

for mac in dic_data: 
    cities = dic_data[mac]['cities'] 
    most_visited_city = max(cities, key=lambda x: cities[x]['count']) 

しかし、どのように2番目の最大訪問都市、3番目の最大訪問都市などを取得します。私はPython 2.7を使用しています。

答えて

2

maxの代わりにsortedを使用できます。

あなたはソートされたリストがcountに基づいて取得すること方法:

d = { 
"b0:47:bf:af:c1:42": 
{ 
"No. of visits": 10, "cities": 
    { 
     "Mumbai": {"count": 5,"last_visited": "5/22/2016"}, 
     "Kolkata": {"count": 2,"last_visited": "5/22/2016"}, 
     "Amritsar":{"count": 3,"last_visited": "5/22/2016"} 
    } 
}, 
"c0:ee:fb:71:be:0d": 
{ 
"No. of visits": 24, "cities": 
{ 
    "Mumbai": {"count": 2,"last_visited": "5/22/2016"}, 
    "Kolkata": {"count": 20,"last_visited": "5/22/2016"}, 
    "Amritsar":{"count": 2,"last_visited": "5/22/2016"} 
} 
} 
} 

for mac in d: 
    cities = d[mac]['cities'] 

    sorted_cities = sorted(cities, key=lambda x: cities[x]['count']) 
    # or if you want the sort to be the other way around 
    reversed_sorted_cities = sorted(cities, key=lambda x: cities[x]['count'], 
            reverse=True) 
    print sorted_cities 


>> ['Kolkata', 'Amritsar', 'Mumbai'] 
    ['Amritsar', 'Mumbai', 'Kolkata'] 

UPDATEあなたはコメントで尋ねた出力を得るために:

d = { ... } 

info = {} 

for mac in d: 
    cities = d[mac]['cities'] 

    info[mac] = sorted(cities, key=lambda x: cities[x]['count']) 

print info 

>> {'b0:47:bf:af:c1:42': ['Kolkata', 'Amritsar', 'Mumbai'], 
    'c0:ee:fb:71:be:0d': ['Mumbai', 'Amritsar', 'Kolkata']} 

も1行で行うことができます 辞書の理解を使用して:

info = {mac: sorted(d[mac]['cities'], key=lambda x: d[mac]['cities'][x]['count']) 
     for mac in d} 
+0

これは間違いなく役立ちますks。私はちょうどもう一つの疑いがあった。私が訪問した都市の最大値を、各ユーザーではなく任意のユーザーが訪れた(またはソートされたリスト)ようにしたい場合。 b0:47:bf:af:c1:42 ':'ムンバイ '、' b0: 47:bf:af:c1:42 ':' Amritsar '] 'など。 –

+0

@ranadan更新された回答を参照してください。 – DeepSpace

+0

申し訳ありませんが、私は質問を正しく説明できませんでした。これはあなたが行ったもう一度各Mac用です。私が望むのは、辞書全体について '' count ''をソートして、キーのサブキーのサブキーであるKeyとSubkeyの両方の出力を返すことです。ちょうど出力を見てください。 「コルカタ」、「b0:47:bf:af:c1:42」:「ムンバイ」、「b0:47:bf:af:c1:42 ':' Amritsar '、' c0:ee:fb:71:be:0d ':'ムンバイ '、' c0:ee:fb:71:be:0d ':' Amritsar '、' b0:47:bf:af :c1:42 ':'コルカタ '] '。 –

関連する問題