2012-03-24 7 views
12

Ich benutze Pythons max Funktion, um die größte ganze Zahl in einem Wörterbuch mit dem Namen count und den entsprechenden Schlüssel zu finden (nicht ganz sicher, ob ich es richtig sage; mein Code erklärt wahrscheinlich selbst besser als ich es erkläre). Das Wörterbuch count ist in Richtung {'a': 100, 'b': 210}, und so weiter.Mit Pythons Max zwei gleich große Werte zurückgeben

number = count[max(count.items(), key=operator.itemgetter(1))[0]] 
highest = max(count, key=count.get) 

Was würde ich tun, wenn dort zwei gleiche größte Werte drin wären? Wenn ich {'a': 120, 'b': 120, 'c': 100} hätte, würde dies nur die ersten von a und b nicht beide finden.

+0

Was Sie tun zu komplex zu sein scheint. Fox-Beispiel: 'number = max (count.values ​​())'. –

+0

Ich kann nicht Einzeiler für diese Art von Fragen 'höchste, Zahl = reduzieren (Lambda a, b: a [0] .append (b [0]) oder (a [0], b [1]) wenn b [1] == a [1] else (([b [0]], b [1]) wenn b [1]> a [1] sonst a), count.iteritems(), ([], -1)) ' –

Antwort

23

Idee ist max-Wert und erhalten Sie alle Schlüssel zu diesem Wert entspricht, zu finden:

count = {'a': 120, 'b': 120, 'c': 100} 

highest = max(count.values()) 

print([k for k, v in count.items() if v == highest]) 
+0

Könntest du ein wenig darüber erzählen, was Python hier macht? Ich bin ziemlich neu dazu. – kidosu

+1

1. count.values ​​() gibt eine Liste von Werten zurück, z. [120, 120, 100]. 2. max (count.values ​​()) liefert einen maximalen Wert aus der Liste, z. 120. 3. count.items() gibt eine Liste von (Schlüssel-, Wert-) Tupeln, z. [('a', 120), ('b', 120), ('c', 100)]. Die letzte Zeile heißt Listenverständnis. Sie können den gleichen Code wie folgt umschreiben. Iterate durch (Schlüssel, Wert) Paare im Wörterbuch, und wenn der Wert derselbe wie höchste ist, dann fügen Sie Schlüssel zu einer Liste hinzu. – Asterisk

+0

Vielen Dank! Gibt es eine Möglichkeit, die Klammern nicht zu drucken? – kidosu

0

dies ein Weg sein könnte (wahrscheinlich nicht die effizienteste).

value = max(count.values()) 
filter(lambda key: count[key]==value,count) 
1

Schnelle Single-Pass:

a = { 'a': 120, 'b': 120, 'c': 100 } 
z = [0] 
while a: 
    key, value = a.popitem() 
    if value > z[0]: 
     z = [value,[key]] 
    elif value == z[0]: 
     z[1].append(key) 

print z 
#output: 
[120, ['a', 'b']] 

Und eine amüsante Art und Weise mit defualtdict:

import collections 
b = collections.defaultdict(list) 
for key, value in a.iteritems(): 
    b[value].append(key) 
print max(b.items()) 
#output: 
(120, ['a', 'b']) 
+0

Als Zwischenergebnis haben Sie eine Karte von (Wert -> [Schlüssel]) für alle Werte. Diese Tatsache (zusätzliche Datenstrukturen) macht es ziemlich langsam (aber ziemlich elegant). – Tupteq

2

gleiche Idee wie Asterisk, aber ohne zweimal über die Liste iterieren. Etwas ausführlicher.

count = { 'a': 120, 'b': 120, 'c': 100 } 
answers = [] 
highest = -1 

def f(x): 
    global highest, answers 
    if count[x] > highest: 
     highest = count[x] 
     answers = [x] 
    elif count[x] == highest: 
     answers.append(x) 

map(f, count.keys()) 
print answers 
0

Manchmal einfachste Lösung die beste sein:

max_value = 0 
max_keys = [] 

for k, v in count.items(): 
    if v >= max_value: 
     if v > max_value: 
      max_value = v 
      max_keys = [k] 
     else: 
      max_keys.append(k) 

print max_keys 

Der obige Code ist etwas schneller als zwei Pass-Lösung wie:

highest = max(count.values()) 
print [k for k,v in count.items() if v == highest] 

Natürlich länger es ist, aber auf der anderen Hand es ist sehr klar und leicht zu lesen.

+0

Ich habe vergessen zu erwähnen - das ist eine Python 3.x-Lösung, Sie verwenden Python 2.x, sollten Sie count.items() durch count.iteritems() ersetzen. – Tupteq

+0

Nichts wert, dass 'count.items()' in Python 2 funktioniert.x auch (wenn auch nicht so effizient). –

0

Um eine Liste ohne Bucket zu drucken. Verwendung:

' '.join(map(str, mylist)) 

oder mehr verbosely:

' '.join(str(x) for x in mylist) 
Verwandte Themen