2016-05-15 15 views
1

Angenommen, wir haben eine dict wie:Python. Holen Sie Schlüsselpaare (n0, _), (n1, _) mit maximalen Werten für jedes Schlüsselpaar (n0, a), (n0, b) in einem Wörterbuch. Keine triviale Aufgabe

os_stats = { 
    ('USA', 'Mac OS X'): 1, 
    ('Mexico', 'iOS'): 3, 
    ('USA', 'Windows XP'): 2, 
    ('Germany', 'Windows 7'): 9, 
    ('Germany', 'Windows XP'): 7, 
    ('Mexico', 'Windows XP'): 2, 
    ... 
} 

Und ich möchte eine Ausgabe wie:

os_preferences = { 
    ('Mexico', 'iOS'): 3, 
    ('USA', 'Windows XP'): 2, 
    ('Germany', 'Windows 7'): 9, 
     ... 
} 

Wo nur der höchste Wert für jedes Land präsentiert wird. Wie kann ich das erreichen?

+2

Können Sie den Code versuchen zu schreiben, es zu tun? –

+0

Ich bin derzeit versucht, aber ATM haben keine Lösung –

+1

Sind Sie sicher, dass die Datenstruktur die beste Möglichkeit zur Darstellung Ihrer Daten ist? Es ist möglicherweise einfacher, stattdessen ein verschachteltes Wörterbuch zu verwenden, damit Sie leicht auf Schlüsselwertgruppen zugreifen können, die sich auf dasselbe Land beziehen. – Bakuriu

Antwort

1

Dieses dict Verständnis tut es:

{country:{os:count} for (country,os),count in sorted(os_stats.items(), key=lambda rec:rec[1])} 

Der erste Teil ist dies:

sorted(os_stats.items(), key=lambda rec:rec[1]) 

Das erzeugt:

[(('USA', 'Mac OS X'), 1), 
(('Mexico', 'Windows XP'), 2), 
(('USA', 'Windows XP'), 2), 
(('Mexico', 'iOS'), 3), 
(('Germany', 'Windows XP'), 7), 
(('Germany', 'Windows 7'), 9)] 

Beachten Sie, dass es durch aufsteigende Reihenfolge der Zählung sortiert ist Feld (rec[1]).

Der Rest ist nur Massieren der Daten in eine einzige dict, die den Effekt der Verwerfung der kleineren Werte durch Überschreiben sie, wie es mit den größeren geht.

+1

Sie müssen die Ausgabe dieses Verständnisses in die gewünschte Form übersetzen, wenn die Ausgabe Ihres Verständnisses "d" ist, wird die gewünschte Ausgabe sein: {{p [0], p [1] .keys() [0]): p [1] .values ​​() [0] für p in d.items()} ' – amiller27

1

pandas bekommt den Job in 3 Zeilen getan:

import pandas as pd 
df = pd.DataFrame(os_stats, index=['index']).transpose() 
os_preferences = df[df['index'] == df.groupby(level=[0])['index'].transform(max)].to_dict()['index'] 

# output: 
# {('Mexico', 'iOS'): 3, 
# ('USA', 'Windows XP'): 2, 
# ('Germany', 'Windows 7'): 9} 
+0

Das ist so total in die Köpfe von OP zu blasen. +1 für Pandas. –

+0

Eigentlich bin ich auf Python beschränkt. Deshalb benutze ich keine Pandas. –

+0

Danke @JohnZwinck! – Daniel