9
votes

Comptez les doublons entre 2 listes

def filter_(x, y):
    count = 0
    for num in y:
        if num in x:
            count += 1
            return count

4 commentaires

Notez qu'une fois que cela fonctionne (dédent le retour deux fois), il a o (n * m) complexit, c'est-à-dire une balance assez horrible.


@delnan merci pour la pointe. Donc, utiliser mieux les échelles d'intersection.


Oui. Vous pouvez réellement faire encore mieux, mais cela nécessite plus d'une ligne de code (l'idée est que vous n'avez besoin que d'un ensemble de la première liste, puis de la seconde et de conserver les éléments qui se trouvent dans l'ensemble - enregistre la création d'une seconde. ensemble).


a contient 1 deux fois, si b contenait 1 doit également être incrémenté par 1 < / code> ou 2 ?


5 Réponses :



3
votes

Convertissez-les en SET CODE> S et comptez l'intersection.

 len(set(a).intersection(set(b)))


0 commentaires

30
votes

chemin plus court et mieux: xxx

pourquoi votre code ne fonctionne pas: xxx

Votre Votre retourne était à l'intérieur de la boucle pour et qu'elle est renvoyée sans exécution étant complète.


0 commentaires

7
votes

Si vous souhaitez compter les entrées multiplicelles, les solutions à base d'ensemble échoueront; Vous aurez besoin de quelque chose comme xxx

puis xxx

retourne 2. L'heure de fonctionnement de cette balance sous O (n + m). < / p>

aussi, votre solution initiale xxx

est fausse - appliquée à [1,2,3,3] et [1,1,1,1, 1,3], votre code reviendra 3 ou 6, aucun dont il est correct (la réponse doit être 2).


1 commentaires

Cette solution est meilleure car elle compte aussi les duplicats, merci :)



1
votes

La solution suivante représente également des éléments en double dans la liste: xxx

puis number_of_duplicat ([1, 2, 2, 2, 3], [1, 2, 2 , 4]) entraîne dans l'attendu 3 .


Notez que @HUGH Bothwell a également fourni une solution similaire, mais elle jette parfois KeyError si un élément n'est contenu que dans la liste plus courte.


0 commentaires