2012-03-24 12 views
12

Używam funkcji Pythona max do znalezienia największej liczby całkowitej ze słownika o nazwie count i odpowiedniego klucza (nie jestem całkiem pewien, czy mówię to poprawnie, mój kod prawdopodobnie wyjaśnia lepiej niż to wyjaśniam). Słownik count jest zgodny z {'a': 100, 'b': 210} i tak dalej.Używanie Pythona do zwracania dwóch równie dużych wartości

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

Co by się stało, gdyby były tam dwie równe wartości? Gdybym miał {'a': 120, 'b': 120, 'c': 100}, znalazłby tylko pierwszy z a i b, a nie oba.

+0

Co zrobić, wydaje się zbyt skomplikowane. Przykład Fox: 'liczba = max (count.values ​​())'. –

+0

Nie mogę oprzeć się jednolinijkom w przypadku takich pytań: najwyższy, liczba = zmniejsz (lambda a, b: a [0] .append (b [0]) lub (a [0], b [1]) jeśli b [1] == a [1] else (([b [0]], b [1]) jeśli b [1]> a [1] jeszcze a), count.iteritems(), ([], -1)) ' –

Odpowiedz

23

Idea jest znalezienie wartości max i uzyskać wszystkie klucze odpowiadające tej wartości:

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

highest = max(count.values()) 

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

Czy mógłbyś wyjaśnić nieco, co robi Python? Jestem całkiem nowy w tym. – kidosu

+1

1. count.values ​​() zwraca listę wartości, np. [120, 120, 100]. 2. max (count.values ​​()) zwraca maksymalną wartość z listy, np. 120. 3. count.items() zwraca listę krotek (klucz, wartość), np. [("a", 120), ("b", 120), ("c", 100)]. Ostatnia linia nazywa się rozumieniem listy. Możesz przepisać ten sam kod w następujący sposób. Iteruj przez pary (klucz, wartość) w słowniku, a jeśli wartość jest taka sama jak najwyższa, dodaj klucz do listy. – Asterisk

+0

Dziękujemy! Czy jest jakiś sposób, aby nie wydrukować nawiasów? – kidosu

0

To może być sposób (prawdopodobnie nie jest to najbardziej wydajne).

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

Szybka jednoprzebiegowe:

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

i zabawny sposób z 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

Jako wynik pośredni masz mapę (wartość -> [klucze]) dla wszystkich wartości. Ten fakt (dodatkowe struktury danych) sprawia, że ​​jest dość powolny (ale dość elegancki). – Tupteq

2

sam pomysł jak Asterisk, ale bez iteracji na liście dwukrotnie. Trochę bardziej gadatliwy.

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

Czasami najprostsze rozwiązanie może być najlepszym:

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 

Powyższy kod jest rozwiązanie nieznacznie szybciej niż dwuprzebigowy jak:

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

Oczywiście to dłużej, ale z drugiej strony Ręka jest bardzo przejrzysta i łatwa do odczytania.

+0

Zapomniałem wspomnieć - to jest Python 3.x, używasz Pythona 2.x, powinieneś zastąpić count.items() przez count.iteritems(). – Tupteq

+0

Warto nic, że 'count.items()' będzie działać w Pythonie 2.x również (choć nie tak skutecznie). –

0

Aby wydrukować listę bez wiadra. używać:

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

lub bardziej Szerzej:

' '.join(str(x) for x in mylist) 
Powiązane problemy