2016-06-30 5 views
1

Ich habe eine JSON-Datei in etwa so.Python - Getting Key mit zweiten und dritten Maximalwert im Wörterbuch

{ 
"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"} 
} 
} 
} 

nun die max besuchte Stadt von einem Benutzer oder den Schlüssel b0:47:bf:af:c1:42 für jeden Schlüssel bekommen ich zur Zeit in ein dict bin Parsen und dann diese verwenden.

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

Aber wie man zweite max besuchte Stadt, dritte max besuchte Stadt und so weiter. Ich benutze Python 2.7.

Antwort

2

Anstatt max zu verwenden, können Sie sorted verwenden.

diese Weise werden Sie eine sortierte Liste auf count Basis erhalten:

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 die Ausgabe, die Sie in den Kommentaren gefragt zu erhalten:

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']} 

Kann auch in einer Zeile durchgeführt werden mit Wörterbuch Verständnis:

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

dies definitiv hilft als ks. Ich hatte nur noch einen Zweifel. Wenn ich die maximal besuchte Stadt erreichen möchte, wird die zweite maximal besuchte (oder sortierte Liste) von jedem Benutzer und nicht von jedem Benutzer besucht. Also, für diesen Fall wird die Ausgabe wie folgt aussehen: ['c0: ee: fb: 71: sei: 0d': 'Kolkata', 'b0: 47: bf: af: c1: 42': 'Mumbai', 'b0: 47: bf: af: c1: 42 ':' Amritsar '] 'und so weiter –

+0

@ranadan Siehe meine aktualisierte Antwort – DeepSpace

+0

Entschuldigung, ich denke, ich konnte meine Frage nicht richtig erklären. Das hast du nochmal gemacht ist für jeden Mac. Was ich will, ist auf "" count "' für ganzes Wörterbuch zu sortieren und die Ausgabe sowohl Schlüssel als auch Unterschlüssel zurückzugeben, da count ein Unterschlüssel des Unterschlüssels key ist. Schauen Sie sich einfach die Ausgabe an. '['c0: ee: fb: 71: sei: 0d': 'Kolkata', 'b0: 47: bf: af: c1: 42': 'Mumbai', 'b0: 47: bf: af: c1: 42 ':' Amritsar ',' c0: ee: fb: 71: sei: 0d ':' Mumbai ',' c0: ee: fb: 71: sei: 0d ':' Amritsar ',' b0: 47: bf: af : c1: 42 ':' Kolkata '] '. –

Verwandte Themen