-2
votes

Supprimer les éléments courants de deux listes (la commande est importante!)

J'ai cherché dans tout le Web mais je n'ai pas trouvé la réponse. Il y a deux listes comme ceci: xxx

Je veux obtenir une sortie comme ceci: xxx

première correspondance des valeurs dupliquées supprimera. Le lien suggéré n'a pas résolu mon problème. Si j'utilise cela, la sortie sera la suivante: xxx


6 commentaires

Cet exemple ne suffit pas, que se passe-t-il en cas de a = [1,2,3,1,4,3,2,1] et b = [1,2,1] ?


Ce serait [3,4,3,2,1] Wanna Supprimer le premier match. Et ma question n'est pas dupliquée


Que se passe-t-il en cas d'a = [1,2,1] et b = [1,2,3,1,4,3,2,1]


L'ordre doit-il correspondre? Si a = [1, 2, 3, 4] fait b = [3, 2, 1] se comporte différemment de b = [1, 2, 3 ] ?


@Darkknight: Sauf si il y a une subtilité que vous n'avez pas expliquée, votre question est une duplicata; Le duplicate lié souhaite également pouvoir supprimer exactement l'une de chaque copie d'une valeur dans une liste à partir d'une autre liste . Vous avez juste besoin de lire plus de réponses, par exemple Celui-ci .


Fyi, j'ai ajouté une réponse à Opération de soustraction de la liste Python qui est la préservation de la commande, se soucie des comptes d'élément et est o (m + n) (plutôt que o (m * n) comme l'autre préservation de la commande, des réponses sensibles au nombre de comptes).


3 Réponses :


1
votes

boucle via la deuxième liste et retirez le premier de chacun dans B:

out = A[:]  # If you don't care about A being changed, this isn't needed

for b in B:
   out.remove(b)


6 commentaires

Et si a = [1,2,1] et b = [1,2,3,1,4,3,2,1]


Cela soulève une ValueError, qui ne me semble pas déraisonnable.


Cela fait O (m * n) travail ( m étant la longueur de B , n longueur de Un ), qui est sous-optimal; Pour les grandes entrées, construire une nouvelle sortie en convertissant B à quelque chose comme Collections.Counter , puis effectue une nouvelle liste de A < / code> Par Ajoutez ing vers la nouvelle liste uniquement si le nombre de comptes de la valeur est 0, sinon décrémentant le nombre de comptes, réduirait le travail à O (M + n) .


@Shadowranger: mais n'est pas ajouté à une liste linéaire, de sorte que ce serait quadratique si tous les éléments d'A sont annexés une par une?


@Remcogerlich: c'est amorti (code> o (1) ; Certains appendent nécessitent un redimensionnement, mais il est globalisé d'un multiple de la taille actuelle, la plupart ne nécessitent donc pas de redimensionnement, ils viennent de mettre le pointeur dans une fente existante et d'incrémenter la longueur logique.


@Remcogerlich: J'ai posté une réponse qui démontre l'approche que j'ai décrite en détail, avec explication si vous souhaitez le vérifier.



0
votes
A = [1,2,1]
B = [1,2,3,1,4,3,2,1]
for b in B:
    if b in A:
        A.remove(b)
        B.remove(b)
print(A+B)
This is waht I suggest!

0 commentaires

0
votes

Essayez ceci: xxx pré>

solution complète: p> xxx pré>

à imprimer dans la commande triée: p>

print (list(set(A).difference(B)))


4 commentaires

Cela ne renverra que 4. «Cause si un objet se répète dans un ensemble, il ne fait pas de diffrance. Que {4} == {4,4,4,4,4}.


J'ai posé cette question moi-même :) Vous voulez dire que je ne sais pas ce que j'ai demandé? :)


Même si cela était correct, liste (défini (a) ^ SET (B)) ne fait pas la bonne chose lorsque B contient des éléments non trouvés dans a ; Le résultat ajoutez ces B -Only éléments. Vous vouliez SET (A) - SET (B) , pas SET (A) ^ SET (B) .


Il s'agit d'éliminer les valeurs dupliquées et cela le fait parfaitement!