使用列表推导查找列表中的元素,其中列表中的所有元素都是因子

问题描述 投票:6回答:3

我有一个数字列表,我从中提取了所有这些数字的常见因素。例如,从列表b = [16, 32, 96],我已经生产了list_of_common_factors = [1, 8, 16, 2, 4]

我有另一个整数列表,a,我希望从list_of_common_factors中提取数字,其中a的所有元素都是因子。因此,如果a = [2, 4],那么我最终应该使用[4, 8, 16],因为这些是list_of_common_factors中的数字,其中2和4是因子。

但是,我正在努力弄清楚如何在列表解析中实现这一步骤,即使在伪代码中也是如此。看起来应该是这样的:[x for x in list_of_common_factors if all elements of a are factors of x]。这是if语句我遇到了麻烦,因为我认为它应该包含一个for循环,但我想不出一个简洁的方法来编写它。

我已经设法做了很长的路,使用嵌套的for循环,它看起来像这样:

between_two_lists = []
# Determine the factors in list_of_common_factors of which all elements of a are factors.
for factor in list_of_common_factors:
    # Check that all a[i] are factors of factor.
    """ Create a counter.
        For each factor, find whether a[i] is a factor of factor.
        Do this with a for loop up to len(a).
        If a[i] is a factor of factor, then increment the counter by 1.
        At the end of this for loop, check if the counter is equal to len(a).
        If they are equal to each other, then factor satisfies the problem requirements.
        Add factor to between_two_lists. """
    counter = 0
    for element in a:
        if factor % element == 0:
            counter += 1
    if counter == len(a):
        between_two_lists.append(factor)

between_two_lists是我试图通过将上面的代码转换为列表理解来生成的列表。如果可能的话,我怎么能这样做呢?

python list for-loop if-statement list-comprehension
3个回答
8
投票

这是你在寻找:

[x for x in list_of_common_factors if all(x % i==0 for i in a)]

1
投票

首先计算a元素的最小公倍数可能更有效,特别是如果a有超过2个元素:

from functools import reduce

def gcd(x, y):    # greatest common divisor
   while y:
       x, y = y, x % y
   return x

def lcm(x, y):    # least common multiple
   return (x*y)//gcd(x,y)

lcm_of_a = reduce(lcm, a)  
result = [x for x in list_of_common_factors if (x % lcm_of_a == 0)]

0
投票

所以基本上,你需要有一个函数从数字列表中返回因子。此函数将返回一个列表。然后你只需要找到两个列表的交集。由于每个因素都是唯一的,我建议使用更高效的集合实现。要恢复,代码将如下所示:

A = set(factors(#Input 1))
B = set(factors(#Input 2))
N = A.intersection(B)
© www.soinside.com 2019 - 2024. All rights reserved.