2017-05-16 3 views
4

J'essaie de trouver les éléments partagés (et le nombre partagé d'occurrences) entre deux listes. Par exemple, l'intersection de ces deux listes:Intersection de deux compteurs

a = [1, 1, 2, 3, 4, 5, 6, 7, 8, 1] 
b = [1, 1, 3, 5, 7, 9] 

doit retourner Counter({1: 2, 3: 1, 5: 1, 7: 1}) ou quelque chose de similaire, par exemple {1: 2, 3: 1, 5: 1, 7: 1} ou [1, 1, 3, 5, 7] (l'ordre de la liste n'a pas d'importance).

J'ai déjà une approche qui fonctionne:

cnts_a = Counter(a) 
cnts_b = Counter(b) 
cnts_a_b = Counter() # counter for the shared values 
for key in set(cnts_a).intersection(cnts_b): 
    cnts_a_b[key] = min(cnts_a[key], cnts_b[key]) 

Mais peut-être il y a un moyen plus facile (ou plus rapide) façon?

Répondre

5

Utilisez & pour intersection:

>>> Counter(a) & Counter(b) 
Counter({1: 2, 3: 1, 5: 1, 7: 1}) 

From docs:

intersection (&) et de l'union (|) renvoient le minimum et maximale de comptes correspondants.

0

Au lieu de

cnts_a_b = Counter() # counter for the shared values 
for key in set(cnts_a).intersection(cnts_b): 
    cnts_a_b[key] = min(cnts_a[k], cnts_b[k]) 

utilisation

cnts_a_b = cnts_a & cnts_b 

comme & signifie l'intersection des Counter objets.