J'ai deux listes en Python, comme celles-ci:
temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']
J'ai besoin de créer une troisième liste avec des éléments de la première liste qui ne sont pas présents dans la seconde. De l'exemple, je dois obtenir:
temp3 = ['Three', 'Four']
Existe-t-il des moyens rapides sans cycles et sans vérification?
python
performance
list
set
set-difference
Max Frai
la source
la source
temp1 = ['One', 'One', 'One']
ettemp2 = ['One']
voulez-vous['One', 'One']
revenir, ou[]
?Réponses:
Attention à ça
où vous pourriez vous attendre / vouloir l'égaler
set([1, 3])
. Si vous voulezset([1, 3])
comme réponse, vous devrez utiliserset([1, 2]).symmetric_difference(set([2, 3]))
.la source
TypeError: 'str' object is not callable
quanda = [1,2,2,2,3]
b = [2]
Les solutions existantes proposent toutes l'une ou l'autre:
Mais jusqu'à présent, aucune solution n'a les deux. Si vous voulez les deux, essayez ceci:
Test de performance
Résultats:
La méthode que j'ai présentée ainsi que la préservation de l'ordre est également (légèrement) plus rapide que la soustraction d'ensemble car elle ne nécessite pas la construction d'un ensemble inutile. La différence de performances serait plus notable si la première liste est considérablement plus longue que la seconde et si le hachage est coûteux. Voici un deuxième test qui le démontre:
Résultats:
la source
la source
temp2
un ensemble avant rendrait cela un peu plus efficace.item not in temp2
etitem not in set(temp2)
renverra toujours les mêmes résultats, qu'il y ait des doublons ou nontemp2
.La différence entre deux listes (disons liste1 et liste2) peut être trouvée en utilisant la fonction simple suivante.
ou
En utilisant la fonction ci-dessus, la différence peut être trouvée en utilisant
diff(temp2, temp1)
oudiff(temp1, temp2)
. Les deux donneront le résultat['Four', 'Three']
. Vous n'avez pas à vous soucier de l'ordre de la liste ou de la liste à donner en premier.Référence doc Python
la source
Dans le cas où vous voulez la différence récursivement, j'ai écrit un package pour python: https://github.com/seperman/deepdiff
Installation
Installer depuis PyPi:
Exemple d'utilisation
Importation
Le même objet revient vide
Le type d'un élément a changé
La valeur d'un article a changé
Élément ajouté et / ou supprimé
Différence de chaîne
Différence de chaîne 2
Changement de type
Liste des différences
Énumérez la différence 2:
Liste des différences en ignorant l'ordre ou les doublons: (avec les mêmes dictionnaires que ci-dessus)
Liste contenant le dictionnaire:
Ensembles:
Tuples nommés:
Objets personnalisés:
Attribut d'objet ajouté:
la source
Peut être fait en utilisant l'opérateur XOR python.
la source
moyen le plus simple,
utilisez set (). difference (set ())
la réponse est
set([1])
peut imprimer sous forme de liste,
la source
Si vous êtes vraiment à la recherche de performances, utilisez numpy!
Voici le carnet complet en tant qu'essentiel sur github avec comparaison entre liste, numpy et pandas.
https://gist.github.com/denfromufa/2821ff59b02e9482be15d27f2bbd4451
la source
je vais lancer car aucune des solutions actuelles ne donne un tuple:
alternativement:
Comme les autres non-tuple donnant des réponses dans ce sens, il préserve l'ordre
la source
Je voulais quelque chose qui prendrait deux listes et pourrait faire quoi
diff
enbash
fait. Puisque cette question apparaît en premier lorsque vous recherchez "python diff two lists" et n'est pas très spécifique, je posterai ce que j'ai trouvé.À l'aide
SequenceMather
de,difflib
vous pouvez comparer deux listes comme lediff
fait. Aucune des autres réponses ne vous indiquera la position où la différence se produit, mais celle-ci le fait. Certaines réponses donnent la différence dans une seule direction. Certains réorganisent les éléments. Certains ne gèrent pas les doublons. Mais cette solution vous donne une vraie différence entre deux listes:Cela produit:
Bien sûr, si votre application fait les mêmes hypothèses que les autres réponses, vous en profiterez le plus. Mais si vous cherchez un vrai
diff
fonctionnalité, c'est la seule façon de procéder.Par exemple, aucune des autres réponses n'a pu gérer:
Mais celui-ci fait:
la source
Essaye ça:
la source
cela pourrait être encore plus rapide que la compréhension de la liste de Mark:
la source
from itertools import filterfalse
bit ici. Notez également que cela ne renvoie pas une séquence comme les autres, il renvoie un itérateur.Voici une
Counter
réponse pour le cas le plus simple.C'est plus court que celui ci-dessus qui fait des différences bidirectionnelles car il ne fait que ce que la question demande: générer une liste de ce qui est dans la première liste mais pas la seconde.
Alternativement, en fonction de vos préférences de lisibilité, il en résulte une doublure décente:
Production:
Notez que vous pouvez supprimer le
list(...)
appel si vous êtes en train de le parcourir.Étant donné que cette solution utilise des compteurs, elle gère correctement les quantités par rapport aux nombreuses réponses basées sur des ensembles. Par exemple sur cette entrée:
La sortie est:
la source
Vous pouvez utiliser une méthode naïve si les éléments de la liste de diffusion sont triés et définis.
ou avec des méthodes de jeu natives:
Solution naïve: 0,0787101593292
Solution de jeu natif: 0.998837615564
la source
Je suis un peu trop tard dans le jeu pour cela, mais vous pouvez comparer les performances de certains des codes susmentionnés avec cela, deux des prétendants les plus rapides sont,
Je m'excuse pour le niveau élémentaire de codage.
la source
Voici quelques simples, qui préservent l'ordre des moyens de diffing deux listes de chaînes.
Code
Une approche inhabituelle utilisant
pathlib
:Cela suppose que les deux listes contiennent des chaînes avec des débuts équivalents. Voir les documents pour plus de détails. Remarque, il n'est pas particulièrement rapide par rapport aux opérations définies.
Une implémentation simple utilisant
itertools.zip_longest
:la source
temp1
ettemp2
alignés. Si vous, par exemple, retournez les éléments danstemp2
ou insérez une autre valeur au début detemp2
, le listcomp renverra simplement les mêmes éléments que danstemp1
Voici une autre solution:
la source
Si vous rencontrez,
TypeError: unhashable type: 'list'
vous devez transformer des listes ou des ensembles en tuples, par exempleVoir aussi Comment comparer une liste de listes / ensembles en python?
la source
Disons que nous avons deux listes
nous pouvons voir à partir des deux listes ci-dessus que les éléments 1, 3, 5 existent dans la liste 2 et les éléments 7, 9 n'existent pas. En revanche, les éléments 1, 3, 5 existent dans la liste 1 et les éléments 2, 4 n'existent pas.
Quelle est la meilleure solution pour renvoyer une nouvelle liste contenant les éléments 7, 9 et 2, 4?
Toutes les réponses ci-dessus trouvent la solution, quelle est maintenant la plus optimale?
contre
En utilisant le temps, nous pouvons voir les résultats
Retour
la source
version monoligne de la solution arulmr
la source
si vous voulez quelque chose de plus comme un changeset ... pourrait utiliser Counter
la source
Nous pouvons calculer l'intersection moins l'union des listes:
la source
Cela peut être résolu avec une seule ligne. La question est donnée deux listes (temp1 et temp2) renvoient leur différence dans une troisième liste (temp3).
la source
Voici un moyen simple de distinguer deux listes (quel que soit le contenu), vous pouvez obtenir le résultat comme indiqué ci-dessous:
J'espère que cela vous sera utile.
la source
Je préfère utiliser la conversion en ensembles puis utiliser la fonction "difference ()". Le code complet est:
Production:
C'est le plus facile à comprendre, et plus à l'avenir si vous travaillez avec des données volumineuses, la conversion en ensembles supprimera les doublons si les doublons ne sont pas nécessaires. J'espère que cela aide ;-)
la source
la source
par exemple si
list1 = [10, 15, 20, 25, 30, 35, 40]
etlist2 = [25, 40, 35]
puis la liste retournée seraoutput = [10, 20, 30, 15]
la source