2017-05-26 4 views
3
finden
def print_most_numbers_occurrences(numbers_str): 
    number_list = list(numbers_str) 
    for i in number_list: 
     i=max(number_list,key=number_list.count) 
    print(i) 

def test_print_most_numbers_occurrences(): 
    print_most_numbers_occurrences('2 3 40 1 5 4 3 3 9 9') 
    print_most_numbers_occurrences('9 30 3 9 3 1 4') 
    print_most_numbers_occurrences('19 30 13 4 9 3 1 4') 


def main(): 
    print(test_print_most_numbers_occurrences()) 


main() 

Ausgangmeisten Zahlen Vorkommen in Listen

None 

Es funktioniert, wenn ich auf diese Weise versuchen:

>>> lst = [1, 2, 45, 55, 5, 4, 4, 4, 4, 4, 545, 56, 6, 7, 67] 
>>> max(lst,key=lst.count) 
4 

Ich will die Nummer identifizieren, die die höchste Anzahl der Male aufgetreten. Ich bin mir nicht sicher, wo ich die erste Def-Funktion falsch gemacht habe.

+2

Lassen Sie Ihre Schleife los. Und tue 'numbers_str.split() 'anstelle von' list (numbers_str) ' – abccd

+0

Hinweis zu allen Antworten (das wird durch den obigen Kommentar angedeutet): das Argumentless' .split() 'behandelt standardmäßig die Doppel-Leerzeichen –

Antwort

3

Als erstes müssen Sie Ihre Eingabe korrekt analysieren. Sie können split(" ") nicht allein verwenden, da einer Ihrer Eingänge doppelt belegt war.

Zweitens brauchen Sie keine Schleife, da max die Schleife für Sie macht.

def print_most_numbers_occurrences(numbers_str): 
    number_list = [int(x) for x in numbers_str.split()] 
    i=max(number_list,key=number_list.count) 
    print(i) 

Da Sie wurden Looping wir die Freiheit, Sie mit dem Fall zu befassen versuchen zu übernehmen haben, wo mehrere Zahlen gleich Vorkommen haben könnten (zum Beispiel: '2 3 40 1 5 4 3 3 9 9 9'). In diesem Fall würde der folgende Code alle Maxima erhalten:

def print_most_numbers_occurrences(numbers_str): 
    print(numbers_str.split(" ")) 
    number_list = [int(x) for x in numbers_str.split()] 
    most_occurances = [] 
    for i in set(number_list): 
     occurances = number_list.count(i) 
     if len(most_occurances) == 0: 
      most_occurances.append(i) 
     elif most_occurances[0] < occurances: 
      most_occurances = [i] 
     elif most_occurances[0] == occurances: 
      most_occurances.append(i) 
    print(most_occurances) 

Hier ist eine kurze Version, die etwas komplexer Code verwendet:

def print_most_numbers_occurrences(numbers_str): 
    number_list = [int(x) for x in numbers_str.split()] 
    result = {i : number_list.count(i) for i in set(number_list)} 
    highest = max(result.values()) 
    most_occurances = [k for k, v in result.items() if v == highest] 
    print(most_occurances) 

Wenn Sie hocheffiziente Code benötigen, ist es ratsam, zu verwenden, collectionsCounter:

from collections import Counter 

def print_most_numbers_occurrences(numbers_str): 
    number_list = [int(x) for x in numbers_str.split()] 
    result = Counter(number_list) 
    highest = max(result.values()) 
    most_occurances = [k for k, v in result.items() if v == highest] 
    print(most_occurances if len(most_occurances) > 1 else most_occurances[0]) 
+0

Die Ausgabe sollte 9 und 3 für Schnur sein ('9 30 3 9 3 1 4') – Kee

+0

Es ist. Es ist eine Liste: '[9, 3]'. Würdest du es in einem anderen Format bevorzugen? Ich beziehe mich auf die zweite und dritte gepostete Methode (die erste erhält nur ein einziges Maximum). – Darkstarone

+0

Wie eckige Klammern für die Ausgabe der dritten Methode entfernen? – Kee

2

Verwenden .split (‘‚) anstelle von Liste()

string = '9 30 3 9 3 1 4' 
lst = map(int, filter(None, string.split(' '))) 
print(max(lst, key = lambda x: lst.count(x))) 
# returns 9 
0

es gibt tatsächlich ein paar Probleme mit dem Code, wie es zur Zeit steht. Sie scheinen das Ergebnis einer Funktion zu drucken, die None zurückgibt und Sie spalten nicht die Zeichenfolge richtig:

def print_most_numbers_occurrences(numbers_str): 
    number_list = [int(number) for number in numbers_str.split(' ') if number != ""] 
    for i in number_list: 
     i=max(number_list,key=number_list.count) 
    print(i, number_list.count(i)) 

def test_print_most_numbers_occurrences(): 
    print_most_numbers_occurrences('2 3 40 1 5 4 3 3 9 9') 
    print_most_numbers_occurrences('9 30 3 9 3 1 4') 
    print_most_numbers_occurrences('19 30 13 4 9 3 1 4') 


def main(): 
    test_print_most_numbers_occurrences() 


main() 
+0

Sie haben Recht, aber wie 9,3 für die Zeichenfolge ('9 30 3 9 3 1 4') ausgegeben werden? – Kee

+0

@Kee Aktualisierte den Code. Es verwendet jetzt die Funktion ".count", um die Anzahl der Vorkommen zu finden. – Neil

+0

Haben Sie es versucht? Es funktioniert nicht so. – Kee

0

Sie können einfach Ihren Code schreiben wie:

>>> import re 
>>> x 
'2  3 40 1 5 4 3 3 9 9' 
>>> list = re.sub(' +', ' ', x).split(' ') 
>>> list 
['2', '3', '40', '1', '5', '4', '3', '3', '9', '9'] 
>>> max(list, key=list.count) 
'3' 
>>> x = '19 30 13 4 9 3 1 4' 
>>> list = re.sub(' +', ' ', x).split(' ') 
>>> list 
['19', '30', '13', '4', '9', '3', '1', '4'] 
>>> max(list, key=list.count) 
'4' 
>>> 

so sollte Ihre Funktion sein wie:

def fun(num_string): 
    num_list = re.sub(' +', ' ', num_string).split(' ') 
    print(max(num_list, key=num_list.count)) # you can write print but I prefer you should use return max(num_list, key=num_list.count) 
1

Verwenden Sie können str.split() verwenden, um Ihre Zeichenfolge in eine Liste zu brechen. Dann können Sie map verwenden, um die Zeichenfolgen in Ganzzahl zu konvertieren. A collections.Counter kann verwendet werden, um das Auftreten jeder ganzen Zahl relativ effizient zu zählen. Schließlich kann max mit einem Lambda-Argument zum Schlüssel über der Anzahl der Vorkommen verwendet werden, um den Zielwert herauszuziehen.

string_list = '2 3 40 1 5 4 3 3 9 9'.split() 
int_list = map(int, string_list) 

from collections import Counter 

counter = Counter(int_list) 
target_value, occurrence_count = max(counter.items(), key=lambda t: t[1]) 

Beachten Sie, dass kein Argument str.split vorgesehen ist, und die Verwendung von list.count vermieden wird (was in diesem Szenario ziemlich ineffizient ist). Wenn Sie alle Zielwerte mit der maximalen Anzahl von Vorkommen erhalten möchten, können Sie diese letzte Zeile verlassen und folgendes verwenden:

Verwandte Themen