6
votes

Rechercher des éléments dans une liste dont tous les éléments d'une autre liste sont des facteurs, en utilisant une compréhension de liste

J'ai une liste de nombres dont j'ai extrait les facteurs communs de tous ces nombres. Par exemple, à partir de la liste b = [16, 32, 96] , j'ai produit list_of_common_factors = [1, 8, 16, 2, 4] .

I avoir une autre liste d'entiers, a et je souhaite extraire les nombres de list_of_common_factors dont tous les éléments de a sont des facteurs. Donc, si a = [2, 4] , alors je devrais me retrouver avec [4, 8, 16] , car ce sont les nombres dans list_of_common_factors code> dont 2 et 4 sont des facteurs.

Cependant, j'ai du mal à comprendre comment implémenter cette étape dans une compréhension de liste, même en pseudocode. Cela devrait ressembler à ceci: [x pour x dans list_of_common_factors si tous les éléments de a sont des facteurs de x] . C'est l'instruction if avec laquelle j'ai du mal car je pense qu'elle devrait contenir une boucle for, mais je ne peux pas penser à une manière concise de l'écrire.

J'ai réussi à le faire depuis longtemps façon, en utilisant une boucle for imbriquée et cela ressemble à ceci:

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 est la liste que j'essaie de produire en convertissant le code ci-dessus en une compréhension de liste. Comment puis-je faire cela, si c'est même possible?


0 commentaires

3 Réponses :


8
votes

C'est ce que vous recherchez:

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


0 commentaires

1
votes

Donc, fondamentalement, vous devez avoir une fonction renvoyant les facteurs d'une liste de nombres. Cette fonction renverrait une liste. Et puis il vous suffit de trouver l'intersection des deux listes. Comme chaque facteur est unique, je suggère d'utiliser une implémentation d'ensemble qui sera plus efficace. Pour reprendre, le code ressemblerait à:

A = set(factors(#Input 1))
B = set(factors(#Input 2))
N = A.intersection(B)


2 commentaires

OP le veut avec une compréhension de liste.


@MehrdadPedramfar Ce qui n'est pas optimal pour ce problème. Alors pourquoi est-il faux de proposer autre chose, que le PO ne savait probablement pas?



1
votes

Il peut être plus efficace de calculer d'abord le multiple le moins commun des éléments de a , surtout si a contient plus de 2 éléments:

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 commentaires