J'ai le code suivant:
return_change_in_list(list_a, list_b) >>> '999'
3 Réponses :
méthode utilisant un compréhension de la liste , (qui est Pas le meilleur que je vais expliquer ensuite): sortie: p> Mesurons l'heure d'exécution de cinq fonctions différentes en utilisant TIMOIT A> Pour savoir quelle méthode est la méthode la plus rapide: p> une des sorties, dans mon ordinateur: p> Lorsque j'ai changé la valeur des listes à: p> la sortie était la suivante: p> et quand j'ai changé la valeur des listes à: p> La sortie était la suivante: p> Notez que différentes listes conduisent à des temps d'exécution différents, différents Il semble que les fonctions 4 et 5 sont les plus rapides de ces cinq. P> compréhensions de liste besoin de itérer sur l'ensemble du C'est vrai, les fonctions 4 et 5 semblent la voie à suivre. :) p> Notez que la fonction 4 est basée sur le Jab 's Réponse , tandis que la fonction 5 est basée sur le GZ0 a> 's répondez et Jab 'S Répondre . Cette réponse m'a pris beaucoup de temps mais je pense que cela valait la peine. P> p> L'élément de la liste d'origine a changé en: 999. Code> p> plage code> peut également affecter le résultat , essayez de le timing par vous-même! p >
list_a code> et list_b code>. Il y a beaucoup de calcul perdu lorsque seul le premier élément est nécessaire. "- GZ0 P>
BlockQuote>
La compréhension de la liste n'accélère pas le processus existant
L'approche de l'auteur suppose que les deux listes ont la même longueur.
Les compréhensions de la liste doivent être itinéraires sur l'ensemble de l'ensemble de l'ensemble du list_a code> et list_b code>. Il y a beaucoup de calcul perdu lorsque seul le premier élément est nécessaire.
En fait, je viens de comprendre que le commentaire ci-dessus ne s'applique pas à l'entrée spécifique de vos tests, où l'élément modifié se produit dans la dernière place. Pour cette entrée, les fonctions 1, 2 et 3 sont probablement plus lentes en raison de (1) la surcharge de la liste de la liste et (2) les accès à la liste des index explicites sont plus lents que zip code>.
Vous avez raison, le changement ne devrait pas arriver à la fin ... Je vais changer cela.
Vous pouvez ajouter une autre entrée tout en conservant le précédent pour démontrer différentes causes des squelettes.
Vous pouvez vérifier si chaque élément de chaque itération est identique également code> itheroTools.zip_longest code> assurera son itération jusqu'à ce que la plus petite liste soit épuisée ce retour Ceci peut également être effectué en utilisant 999 code>. Si tous les éléments sont identiques, returns Aucun code> p> Suivant code> comme Gzo indiqué, car c'est la même logique que la mine. Mais j'utiliserais Aucun code> comme défaut. P>
Édité pour retourner b code> quand ils diffèrent. De plus, si les deux listes ont toujours la même longueur, alors n'ayez pas besoin zip_longest code>
next(b for a, b in zip(list_a, list_b) if a != b)
Vous ne voulez pas dire suivant (b pour a, b dans zip (list_a, list_b) si a! = B) code>
list_a == list_b ??
Pour différentes longueurs, vous pouvez utiliser
itheroTools.zip_longest code> mais l'algorithme que vous avez décrit est la même@Vicrobot mais je veux retourner l'élément qui a changé dans
list_b code>@Ketledegennaro Pouvez-vous mettre à jour votre question pour refléter cela? Parce que votre code actuel ne renvoie pas l'élément.
Dupliqué possible de Comment itérer à deux listes en parallèle?
@Kledegennaro Il n'y a pas d'algorithme de fantaisie qui rendra cela plus rapide que celui itératant à travers les listes en parallèle. Vous pouvez obtenir une vitesse d'accélération de l'utilisation d'une liste code> numpy code> sur la liste
code> s mais c'est vraiment dépendant de la situation.Aussi L'ordre des chiffres dans les deux listes n'a pas d'importance i>? C'est incompatible avec cela que vous avez décrit dans le problème.
@Pault La commande compte quand je suis itération afin que je puisse retourner où se produit une différence. Si je vérifie deux listes pour voir où un élément change l'ordre n'aura pas d'importance.