2017-03-24 3 views
0

Ich versuche, eine Funktion zu erstellen, die die Ganzzahl mit den meisten Teilern zurückgibt, wenn sie mit einer Liste versehen ist.Finde Ganzzahlen mit den meisten Divisoren

def number_of_divisors(k): 
    count = 0 
    for number in range(1, k+1): 
     if k % number == 0: 
      count += 1 
    return count 

def max_divisors(list_i): 
    return(max(list_i, key = number_of_divisors)) 

Diese Funktion funktioniert einwandfrei. Aber wenn mit einer Liste wie [8,12,18,6] versehen, sind 12 und 18 für die maximale Anzahl von Teilern gebunden. Es gibt nur das erste Element mit der maximalen Anzahl von Teilern, d. H. 12. Ich möchte, dass es auch 18 zurückgibt. Wie erreiche ich das?

+0

Diese Frage wird richtig gestellt, vorausgesetzt, der Code der OP schrieb aber bittet um Hilfe, um etwas zu lösen, er hat keine Ahnung wie. Dies verdient es nicht geschlossen zu werden, da es die SO-Regeln respektiert. –

+0

Es ist erwähnenswert, dass im Allgemeinen eine 'number_of_divisors'-Funktion viel schneller als 'O (n)' gemacht werden kann. – Cireo

Antwort

1

Sie gehen zu müssen, alle Ergebnisse sammeln, und Sie ein Wörterbuch verwenden können, um die Anzahl von Teilern auf die Zahlen zur Karte und zurück nur diese Liste von Zahlen, zB:

def max_divisors(list_i): 
    d = {} 
    for n in list_i: 
     d.setdefault(number_of_divisors(n), []).append(n) 

    return d[max(d)] 

>>> max_divisors([8,12,18,6]) 
[12, 18] 
+0

Elegant, aber ich würde collections.defaultdict (list) für d verwenden –

+0

In der Tat, 'defaultdict' würde genauso gut funktionieren und den Code mit dem zusätzlichen' import' ein wenig sauberer machen. – AChampion

0

Sie umschreiben könnte Ihre max_divisors Funktion wie folgt:

def max_divisors(items): 
    div_list = list(map(number_of_divisors, items)) 
    most = max(div_list) 
    return [items[i] for i, div in enumerate(div_list) if div == most] 

die erste Zeile eine Liste von Divisoren entsprechend Ihre Elemente erzeugt, so dass div_list[i] auf die Anzahl der Teiler der Anzahl an items[i] gleich ist. Die zweite Zeile findet die maximale Anzahl von Divisoren, und die dritte Zeile marschiert durch Ihre Teilerliste und fügt die entsprechende Zahl nur dann zur Rückgabeliste hinzu, wenn sie die maximale Anzahl von Divisoren aufweist.

Die dritte Zeile enthält ein Beispiel für ein Python-Listenverständnis; seit du ein Anfänger bist, hast du vielleicht noch nie eines davon gesehen. Seine allgemeine Form ist

[item for item in sequence if cond] 

ein Ausdruck, der auf filtered im ausführlichere Code unten

filtered = [] 
for item in sequence: 
    if cond: 
     filtered.append(item) 

Hinweis äquivalent ist, dass sowohl das item und cond Feld in der Liste Verständnis jeder Python-Ausdruck sein kann.

+1

Sie könnten auch 'zip()' anstelle von 'enumerate' verwenden -' [n für n, div in zip (Liste, div_list) wenn div == most] ' – AChampion

Verwandte Themen