Найти элементы в списке, все элементы которого в другом списке являются факторами, используя понимание списка - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть список чисел, из которых я извлек общие факторы всех этих чисел.Например, из списка 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 - это список, который я пытаюсь составить путем преобразования приведенного выше кода в понимание списка.Как я могу это сделать, если это вообще возможно?

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Так что, в принципе, вам нужна функция, возвращающая факторы из списка чисел.Эта функция возвращает список.И тогда вам просто нужно найти пересечение обоих списков.Поскольку каждый фактор уникален, я предлагаю использовать набор реализаций, который будет более эффективным.Чтобы возобновить, код будет выглядеть так:

A = set(factors(#Input 1))
B = set(factors(#Input 2))
N = A.intersection(B)
0 голосов
/ 17 февраля 2019

Может оказаться более эффективным сначала вычислить наименьшее общее кратное элементов 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 голосов
/ 17 февраля 2019

Это то, что вы ищете:

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