Je veux prendre deux listes et trouver les valeurs qui apparaissent dans les deux.
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
returnMatches(a, b)
reviendrait [5]
, par exemple.
Je veux prendre deux listes et trouver les valeurs qui apparaissent dans les deux.
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
returnMatches(a, b)
reviendrait [5]
, par exemple.
Réponses:
Ce n'est pas le plus efficace, mais de loin le moyen le plus évident de le faire est:
>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
{5}
si l'ordre est important, vous pouvez le faire avec des listes de compréhension comme celle-ci:
>>> [i for i, j in zip(a, b) if i == j]
[5]
(ne fonctionne que pour les listes de taille égale, ce qui implique une signification d'ordre).
&
) ou set(a).intersection(b)
sera aussi rapide ou plus rapide que la compréhension de la liste.
set(a) & set(b)
?
Utilisez set.intersection () , c'est rapide et lisible.
>>> set(a).intersection(b)
set([5])
bool(set(a).intersection(b))
pour True
ouFalse
difference
ou union
.
.intersection()
vs &
?
Un test de performance rapide montrant la solution de Lutz est le meilleur:
import time
def speed_test(func):
def wrapper(*args, **kwargs):
t1 = time.time()
for x in xrange(5000):
results = func(*args, **kwargs)
t2 = time.time()
print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
return results
return wrapper
@speed_test
def compare_bitwise(x, y):
set_x = frozenset(x)
set_y = frozenset(y)
return set_x & set_y
@speed_test
def compare_listcomp(x, y):
return [i for i, j in zip(x, y) if i == j]
@speed_test
def compare_intersect(x, y):
return frozenset(x).intersection(y)
# Comparing short lists
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)
# Comparing longer lists
import random
a = random.sample(xrange(100000), 10000)
b = random.sample(xrange(100000), 10000)
compare_bitwise(a, b)
compare_listcomp(a, b)
compare_intersect(a, b)
Voici les résultats sur ma machine:
# Short list:
compare_bitwise took 10.145 ms
compare_listcomp took 11.157 ms
compare_intersect took 7.461 ms
# Long list:
compare_bitwise took 11203.709 ms
compare_listcomp took 17361.736 ms
compare_intersect took 6833.768 ms
Évidemment, tout test de performance artificiel doit être effectué avec un grain de sel, mais comme la set().intersection()
réponse est au moins aussi rapide que les autres solutions, et aussi la plus lisible, elle devrait être la solution standard pour ce problème commun.
set
partir d'un existant list
ne supprimera rien de l'original list
. Si vous voulez une logique spéciale pour gérer les doublons dans une liste, je pense que vous devrez poser une nouvelle question car la réponse devra être spécifique à la façon dont vous voulez que les doublons soient traités.
Je préfère les réponses basées sur un ensemble, mais en voici une qui fonctionne quand même
[x for x in a if x in b]
La façon la plus simple de le faire est d'utiliser des ensembles :
>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(a) & set(b)
set([5])
Façon rapide:
list(set(a).intersection(set(b)))
>>> s = ['a','b','c']
>>> f = ['a','b','d','c']
>>> ss= set(s)
>>> fs =set(f)
>>> print ss.intersection(fs)
**set(['a', 'c', 'b'])**
>>> print ss.union(fs)
**set(['a', 'c', 'b', 'd'])**
>>> print ss.union(fs) - ss.intersection(fs)
**set(['d'])**
Voulez-vous des doublons? Sinon, vous devriez plutôt utiliser des ensembles:
>>> set([1, 2, 3, 4, 5]).intersection(set([9, 8, 7, 6, 5]))
set([5])
une autre façon un peu plus fonctionnelle de vérifier l'égalité des listes pour la liste 1 (lst1) et la liste 2 (lst2) où les objets ont une profondeur un et qui maintient l'ordre est:
all(i == j for i, j in zip(lst1, lst2))
a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]
lista =set(a)
listb =set(b)
print listb.intersection(lista)
returnMatches = set(['5']) #output
print " ".join(str(return) for return in returnMatches ) # remove the set()
5 #final output
Vous pouvez utiliser:
a = [1, 3, 4, 5, 9, 6, 7, 8]
b = [1, 7, 0, 9]
same_values = set(a) & set(b)
print same_values
Production:
set([1, 7, 9])
Si vous voulez une valeur booléenne:
>>> a = [1, 2, 3, 4, 5]
>>> b = [9, 8, 7, 6, 5]
>>> set(b) == set(a) & set(b) and set(a) == set(a) & set(b)
False
>>> a = [3,1,2]
>>> b = [1,2,3]
>>> set(b) == set(a) & set(b) and set(a) == set(a) & set(b)
True
La solution suivante fonctionne pour n'importe quel ordre des éléments de liste et prend également en charge les deux listes pour être de longueur différente.
import numpy as np
def getMatches(a, b):
matches = []
unique_a = np.unique(a)
unique_b = np.unique(b)
for a in unique_a:
for b in unique_b:
if a == b:
matches.append(a)
return matches
print(getMatches([1, 2, 3, 4, 5], [9, 8, 7, 6, 5, 9])) # displays [5]
print(getMatches([1, 2, 3], [3, 4, 5, 1])) # displays [1, 3]
np.intersect1d(list1, list2)
you can | for set union and & for set intersection.
for example:
set1={1,2,3}
set2={3,4,5}
print(set1&set2)
output=3
set1={1,2,3}
set2={3,4,5}
print(set1|set2)
output=1,2,3,4,5
curly braces in the answer.
&
opérateur sur le plateau est déjà répondu par SilentGhost dans la réponse acceptée