2017-03-24 6 views
0

私は、リストで提供されるときに、ほとんどの除数で整数を返す関数を作成しようとしています。ほとんどの除数との整数を見つける

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)) 

この機能は問題なく機能します。しかし、[8,12,18,6]、12と18のようなリストが提供されている場合、除数の最大数に縛られます。それは、除数の最大数が12である最初の項目だけを返します。それは18を返すようにしたいと思います。これを達成する方法は?

+0

この質問は適切に尋ねられますが、OPが書いたコードを提供していますが、何かを解決するためには助けを求めます。これは、SOのルールを尊重しているので、閉鎖されている必要はありません。 –

+0

一般に、 'number_of_divisors'関数は' O(n) 'よりもはるかに高速化できます。 – Cireo

答えて

1

あなたはすべての結果を収集する必要があるとしている、とあなたは数字に約数の数をマッピングし、数字だけ、例えばのリストを返すために辞書を使用することができます。

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

エレガントですが、私はcollections.defaultdict(list)をd –

+0

として使っています。実際に 'defaultdict'も同様に動作し、追加の' import'を使ってコードを少しきれいにします。 – AChampion

0

あなたは書き換えることができこのように、あなたのmax_divisors機能:div_list[i]items[i]における数の約数の数と等しくなるように最初の行は、アイテムに対応する除数のリストを生成

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] 

。 2行目は最大除数を見つけ、3行目は除数リストを実行し、最大除数を持つ場合にのみ対応する数値を戻りリストに追加します。

3行目には、Pythonリストの理解の例が含まれています。あなたは初心者であるため、以前はこれを見たことがないかもしれません。その一般的な形式は

[item for item in sequence if cond] 

リスト内包でitemcondフィールドの両方が任意のPython式とすることができること

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

注以下でより冗長コードにfilteredに相当する式です。

+1

また、 'enumerate'の代わりに' zip() 'を使うこともできます。' 'div == most 'の場合は[zip(list、div_list) – AChampion

関連する問題