我正在尝试编写一个函数,该函数将查找所有数字,这些数字是列表中的至少一个数字的倍数,其中倍数小于某个数字。这是我到目前为止所尝试的内容:
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循环来做到这一点。
答案 0 :(得分:7)
您可以使用Python any()函数来检查MultArray中是否至少有一个分隔符实例:
def MultiplesUnderX(MultArray,X):
return [i for i in range(X) if any(i % x == 0 for x in MultArray)]
答案 1 :(得分:1)
你可以使用Python内置函数any
,如果传入的iterable包含任何真值y值和列表理解结束时的条件限制列表,则返回True
仅限满足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]
答案 2 :(得分: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]