列表理解以查找列表中每个数字的所有倍数小于数字

时间:2017-06-26 22:30:07

标签: python list-comprehension

我正在尝试编写一个函数,该函数将查找所有数字,这些数字是列表中的至少一个数字的倍数,其中倍数小于某个数字。这是我到目前为止所尝试的内容:

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循环来做到这一点。

3 个答案:

答案 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]