-3
votes

Python Le moyen le plus rapide de retourner l'élément modifié d'une liste à une autre

J'ai le code suivant:

return_change_in_list(list_a, list_b)
>>> '999' 


8 commentaires

list_a == list_b ??


Pour différentes longueurs, vous pouvez utiliser itheroTools.zip_longest 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


@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 numpy sur la liste s mais c'est vraiment dépendant de la situation.


Aussi L'ordre des chiffres dans les deux listes n'a pas d'importance ? 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.


3 Réponses :


1
votes

méthode utilisant un compréhension de la liste , (qui est Pas le meilleur que je vais expliquer ensuite): xxx

sortie:

L'élément de la liste d'origine a changé en: 999.

Mesurons l'heure d'exécution de cinq fonctions différentes en utilisant TIMOIT Pour savoir quelle méthode est la méthode la plus rapide: xxx

une des sorties, dans mon ordinateur: xxx

Lorsque j'ai changé la valeur des listes à: xxx

la sortie était la suivante: xxx

et quand j'ai changé la valeur des listes à: xxx

La sortie était la suivante: xxx

Notez que différentes listes conduisent à des temps d'exécution différents, différents plage peut également affecter le résultat , essayez de le timing par vous-même!

Il semble que les fonctions 4 et 5 sont les plus rapides de ces cinq.

compréhensions de liste besoin de itérer sur l'ensemble du list_a et list_b . Il y a beaucoup de calcul perdu lorsque seul le premier élément est nécessaire. "- GZ0

C'est vrai, les fonctions 4 et 5 semblent la voie à suivre. :)

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 '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.


6 commentaires

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 et list_b . 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 .


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.



1
votes

Vous pouvez vérifier si chaque élément de chaque itération est identique également itheroTools.zip_longest assurera son itération jusqu'à ce que la plus petite liste soit épuisée xxx

ce retour 999 . Si tous les éléments sont identiques, returns Aucun

Ceci peut également être effectué en utilisant Suivant comme Gzo indiqué, car c'est la même logique que la mine. Mais j'utiliserais Aucun comme défaut. xxx


1 commentaires

Édité pour retourner b quand ils diffèrent. De plus, si les deux listes ont toujours la même longueur, alors n'ayez pas besoin zip_longest



0
votes
next(b for a, b in zip(list_a, list_b) if a != b)

1 commentaires

Vous ne voulez pas dire suivant (b pour a, b dans zip (list_a, list_b) si a! = B)