Python - Supprimer un jeu d'une liste dans une autre liste
array1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array2 = [1, 2, 2, 2, 5, 6, 6, 6, 9]
temp = set(array2)
array1.remove(temp)
Traceback (most recent call last):
File "Sudoku V2.py", line 6, in <module>
array1.remove(temp)
ValueError: list.remove(x): x not in list
- Quelle partie du message d'erreur est source de confusion?
set(array2)
n'est pas dansarray1
. - Que voulez-vous réellement supprimer du tableau array1? Chaque élément de matrice2?
- quelle est votre question???
- En général, il aide si vous vous montrez le résultat désiré plutôt que de nous faire deviner à elle. Voir SSCCE pour l'orientation.
InformationsquelleAutor DGDD | 2013-09-16
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Ci-dessus rend l'utilisation de la différence() méthode des ensembles, qui retourne un nouveau jeu avec des éléments de l'ensemble qui ne sont pas dans l'itérable(s) reçue en paramètre. Notez qu'il n'y a pas besoin de convertir
array2
à un ensemble pour que cela fonctionne.Aussi être conscient qu'en utilisant des ensembles, tous les éléments en double seront supprimés et l'ordre original des iterables ne sera pas nécessairement être préservé. Si c'est un problème, essayez cette solution de rechange:
array1
, et toutes les valeurs en double ainsi. Je ne vois pas une bonne raison dans le cas des OP question de supposer que cela est inacceptable. Mais ce serait une meilleure réponse si vous l'avez expliqué les conséquences de cette façon de faire (et offert une autre alternative si elles ne sont pas acceptables).Si vous n'avez pas de soins sur l'ordre des éléments dans le résultat, ou sur les éléments en double,
set.difference
, comme dans d'Oscar López de réponse, c'est exactement ce que vous voulez.Si vous ne de soins au sujet de l'ordre et de la préservation de doublons, de la façon la plus simple est de simplement créer une nouvelle liste, en filtrant ceux
array2
:Si vous avez besoin de modifier de façon destructrice
array1
en place au lieu d'en construire un nouveau, il est presque toujours plus simple pour destructive, remplacer le contenu dearray1
tout à la fois:Si vous voulez vraiment modifier l'élément par élément, le meilleur moyen serait d'itérer
array1
en arrière, retrait sur place:Enfin, vous peut le faire de la manière flornquake suggéré, mais que va prendre quadratique du temps au lieu de linéaire, car il ne prend pas avantage de la
set
; pour chaque élément dansset2
, il fait un linéairearray1.remove
.array1 = [item for item in array1 if item not in set(array2)]
devrait êtres = set(array2); array1 = [item for item in array1 if item not in s]
pour éviter quadratique comportement.Voulez-vous matrice1 - matrice2?
set1 = set(matrice1)
set2 = set(tableau2)
set1.différence(set2) est ce que vous voulez.
array2
à un jeu dedifference
prend un objet iterable comme argument, voir ma réponse.s -> séquence
http://docs.python.org/3/library/stdtypes.html#index-23
Aucun des éléments dans le tableau array1 est un ensemble. Tous les éléments du tableau array1 sont des nombres entiers.
La
remove()
méthode ne prend qu'un seul élément de la liste, de sorte que nous avons à faire qu'une seule fois pour chaque élément:D'autres méthodes telles que Óscar et abanert sont mieux, ils sont plus idiomatiques et beaucoup plus efficace.