2017-06-26 52 views
4

我想寫一個函數,它將找到所有數字是至少一個數字的倍數至少一個數字在少於一個一定數量。以下是我試過到目前爲止:列表理解,找到列表中的每個數字的所有倍數小於一個數字

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)將返回[2,3,4,6,8,9]。我有點不確定如何使用列表理解中的for循環來做到這一點。

+1

爲什麼'3'不是在結果列表中? –

+1

因爲我沒有在15個小時內睡過。 – greenthumbtack

+1

'(對於MultArray中的x,i%x == 0)'是一個生成器表達式,而不是列表理解中的「for-loop」(這種情況是不可能的,因爲for循環需要for語句) 。它返回一個生成器對象,它是truthy。你想要使用'any'使用該生成器 –

回答

7

您可以使用Python的任何()函數來檢查是否有在MultArray分隔的至少一個實例:

def MultiplesUnderX(MultArray,X): 

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

在那裏有一個額外的圓括號,但我喜歡它! – greenthumbtack

+0

這會返回一個列表,其中包含很多額外的'0'到你的理解中的'else 0'。另外,在2.7版本中'xrange'會更有效率,以避免創建一個巨大的列表。 – foslock

+0

編輯看起來不錯! – foslock

1

您可以使用Python的內置函數any返回True如果傳入的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] 
相關問題