269 votes

Comparaison des éléments communs entre les deux listes

Étant donné deux listes d'entrée, comment puis-je créer une liste des éléments qui sont communs aux deux entrées ?

Par exemple : pour les entrées [1,2,3,4,5,6] y [3,5,7,9] le résultat devrait être [3, 5] ; pour les entrées ['this','this','n','that'] y ['this','not','that','that'] le résultat devrait être ['this', 'that'] .


<p><strong>Voir aussi</strong></p><ul><li><a href="https://stackoverflow.com/questions/18264471/">En Python, comment trouver des mots communs dans deux listes tout en préservant l'ordre des mots ? </a>(pour maintenir l'ordre)</li><li><a href="https://stackoverflow.com/questions/3852780/">Python -Intersection de plusieurs listes ? </a>(pour calculer l'intersection entre >= 3 listes)</li><li><a href="https://stackoverflow.com/questions/37645053/">Intersection de deux listes comprenant des doublons ? </a>(pour conserver les éléments en double)</li></ul>

471voto

SilentGhost Points 79627

Utilisez la fonction intersection des ensembles :

>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]

48voto

Tamás Points 18211

Les solutions proposées par S.Mark y Fantôme silencieux vous indique généralement comment procéder de manière pythonique, mais j'ai pensé qu'il serait également utile de savoir pourquoi votre solution ne fonctionne pas. Le problème est que dès que vous trouvez le premier élément commun aux deux listes, vous ne renvoyez que cet élément. Votre solution pourrait être corrigée en créant un result et de collecter les éléments communs de cette liste :

def common_elements(list1, list2):
    result = []
    for element in list1:
        if element in list2:
            result.append(element)
    return result

Une version encore plus courte utilisant des compréhensions de listes :

def common_elements(list1, list2):
    return [element for element in list1 if element in list2]

Cependant, comme je l'ai dit, il s'agit d'une méthode très inefficace - les types d'ensembles intégrés de Python sont bien plus efficaces car ils sont implémentés en C en interne.

45voto

BeyondRubicon Points 455

Vous pouvez également utiliser des ensembles et obtenir les points communs en une seule ligne : soustrayez l'ensemble contenant les différences de l'un des ensembles.

A = [1,2,3,4]
B = [2,4,7,8]
commonalities = set(A) - (set(A) - set(B))

40voto

Mahmoud Reda Points 573

Vous pouvez résoudre ce problème en utilisant numpy :

import numpy as np

list1 = [1, 2, 3, 4, 5, 6]
list2 = [3, 5, 7, 9]

common_elements = np.intersect1d(list1, list2)
print(common_elements)

common_elements sera le tableau numpy : [3 5] .

37voto

YOU Points 44812

Utiliser les intersections de set, set(list1) & set(list2)

>>> def common_elements(list1, list2):
...     return list(set(list1) & set(list2))
...
>>>
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>>
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
>>>
>>>

Notez que la liste des résultats peut être différente de la liste originale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X