2017-06-26 2 views
4

から検索することができます。複数の数字がリスト内の少なくとも1つの数字の倍数であるすべての数字を見つける関数を作成しようとしています特定の番号。 [2,3,4,6,8,9]戻ってくる例えばリスト内の各数字のすべての倍数を数字よりも小さい数字の

def MultiplesUnderX(MultArray,X): 
    ''' 
    Finds all the multiples of each value in MultArray that 
    are below X. 
    MultArray: List of ints that multiples are needed of 
    X: Int that multiples will go up to 
    ''' 
    return [i if (i % x == 0 for x in MultArray) else 0 for i in range(X)] 

、MultiplesUnderX([2,3]、10):ここには、私がこれまで試したものです。私はリストの理解の中でforループを使ってこれをどうやって行うのか少し不明です。

+1

はなぜ '3'ない結果リストにありますか? –

+1

私は15時間で寝なかったので。 – greenthumbtack

+1

'(マルチアレイでxに対してi%x == 0)'は、リスト内包表記のforループ内ではなく、ジェネレータ式です(forループにはfor文が必要なため、このようなことはできません)それはジェネレータオブジェクトを返します。これは真実です。あなたは 'any'を使ってそのジェネレータを消費したいとします。 –

答えて

7

あなたMultArrayにおける分周器の少なくとも1つのインスタンスが存在するかどうかをチェックするPythonの任意の()関数を使用することができ:

def MultiplesUnderX(MultArray,X): 

    return [i for i in range(X) if any(i % x == 0 for x in MultArray)] 
+0

余分な括弧が入っていますが、私は大好きです! – greenthumbtack

+0

これは余分な' 0'をたくさん含むリストを返すまた、2.7では 'xrange'は巨大なリストの作成を避けるために少し効率的になります。 – foslock

+0

編集がうまくいきます! – foslock

1

あなたはTrue場合を返す組み込み関数anyパイソンを使用することができiterableには、リスト内包表記の末尾にある条件付きの真偽値と組み合わせて真偽値が入り、any呼び出しを満たす要素のみにリストを限定します。

def get_multiples_under(factors, max): 
    return [i for i in xrange(1, max) if any(i % factor == 0 for factor in factors)] 

あなたの所望の出力は、そのようなものとして示されている:リストのほとんどが互いに素であれば、より効率的かもしれこのアルゴリズムの

multiples = [2, 3] 
print get_multiples_under(multiples, 10) 
# [2, 3, 4, 6, 8, 9] 
0

別のバージョン、あなただけの唯一の生成にrange(i, X, i)を使用することができますiの倍数を使用してから、heapq.mergeを使用してイテレータをマージし、返されたイテレータがソートされるようにします。

最後のステップは、あなたが行くように重複を排除することです:

import heapq 

def all_multiples(multi_list, max_N): 
    gens = [] 
    for fac in sorted(set(multi_list)): 
     # In Python 3 this is a generator of all multiples of "fac" less 
     # than max_N. In Python 2 use xrange 
     gens.append(range(fac, max_N, fac)) 

    # This will do a heap merge on the generators (which are already sorted) 
    o = heapq.merge(*gens) 
    last = None 
    for val in o: 
     if val != last: 
      yield val 
      last = val 


if __name__ == "__main__": 
    multi_list = [2, 4, 7] 
    print(list(all_multiples(multi_list, 12))) 
    # [2, 4, 6, 7, 8, 10] 
関連する問題