def common_elements(list1, list2):
"""
Return a list containing the elements which are in both list1 and 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']
"""
for element in list1:
if element in list2:
return list(element)
Je l'ai jusqu'à présent, mais je n'arrive pas à le faire fonctionner!
Des idées?
Réponses:
la source
Vous pouvez également utiliser des ensembles et obtenir les points communs sur une seule ligne: soustrayez l'ensemble contenant les différences de l'un des ensembles.
la source
Les solutions suggérées par S.Mark et SilentGhost vous indiquent généralement comment cela doit être fait de manière pythonique, mais j'ai pensé que vous pourriez également bénéficier de savoir pourquoi votre solution ne fonctionne pas. Le problème est que dès que vous trouvez le premier élément commun dans les deux listes, vous ne retournez que cet élément unique. Votre solution pourrait être corrigée en créant une
result
liste et en collectant les éléments communs de cette liste:Une version encore plus courte utilisant des compréhensions de liste:
Cependant, comme je l'ai dit, c'est une façon très inefficace de faire cela - les types d'ensemble intégrés de Python sont beaucoup plus efficaces car ils sont implémentés en C en interne.
la source
utiliser définir les intersections, définir (liste1) et définir (liste2)
Notez que la liste de résultats peut être dans un ordre différent de la liste d'origine.
la source
vous pouvez utiliser une simple compréhension de liste:
la source
Set est une autre façon de résoudre ce problème
la source
liste1 = [1,2,3,4,5,6] liste2 = [3,5,7,9]
Je sais que 3 façons peuvent résoudre ce problème, bien sûr, il pourrait y en avoir plus.
1-
2-
3-
La troisième méthode est la plus rapide car les ensembles sont implémentés à l'aide de tables de hachage.
la source
Les réponses précédentes fonctionnent toutes pour trouver les éléments communs uniques, mais ne prendront pas en compte les éléments répétés dans les listes. Si vous souhaitez que les éléments communs apparaissent sous le même numéro qu'ils se trouvent en commun sur les listes, vous pouvez utiliser le one-liner suivant:
La
or True
pièce n'est nécessaire que si vous vous attendez à ce que des éléments soient évaluésFalse
.la source
set
ce qui n'est pas stable (c'est-à-dire la commande est perdue).J'ai comparé chacune des méthodes mentionnées par chaque réponse. En ce moment, j'utilise python 3.6.3 pour cette implémentation. C'est le code que j'ai utilisé:
Si vous exécutez ce code, vous pouvez voir que si vous utilisez la liste ou le générateur (si vous itérez sur le générateur, pas seulement l'utilisez. Je l'ai fait lorsque j'ai forcé le générateur à en afficher la longueur), vous obtenez presque les mêmes performances. Mais si vous utilisez set, vous obtenez de bien meilleures performances. De plus, si vous utilisez la méthode d'intersection, vous obtiendrez des performances un peu meilleures. le résultat de chaque méthode sur mon ordinateur est indiqué ci-dessous:
la source
c'est ma proposition je pense que c'est plus facile avec des ensembles qu'avec une boucle for
la source
Pourquoi ne pas l'utiliser
list comprehension
?Solution demi-ligne:
la source
1) La méthode1 de sauvegarde de la liste1 est le dictionnaire, puis l'itération de chaque élément de la liste2
Trouver des éléments communs et différents:
2) Méthode 2 en utilisant set
la source
Utilisez un générateur:
L'avantage ici est que cela reviendra en temps constant (presque instantané) même lors de l'utilisation de listes énormes ou d'autres énormes itérables.
Par exemple,
Toutes les autres réponses ici prendront beaucoup de temps avec ces valeurs pour list1 et list2.
Vous pouvez ensuite itérer la réponse avec
Ou convertissez-le en liste avec
la source
for i in common: print(i)
. Les générateurs sont des itérables qui sont fréquemment utilisés à la place d'autres itérables tels que les listes.