Python: comment faire pour ajouter le contenu d'un objet iterable à un jeu?
Quel est le "l'un [...] de manière évidente" pour ajouter tous les éléments d'un objet iterable à un set
?
Vous devez vous connecter pour publier un commentaire.
Quel est le "l'un [...] de manière évidente" pour ajouter tous les éléments d'un objet iterable à un set
?
Vous devez vous connecter pour publier un commentaire.
par set, voulez-vous dire
set
?set
constructeur prend un objet iterable comme argument.{1, 2, 3}
en Python 3, alors qu'il étaitset([1, 2, 3])
en Python 2.Pour le bénéfice de toute personne qui pourrait croire, par exemple, que faire
aset.add()
dans une boucle aurait performance compétitive avec faireaset.update()
, voici un exemple de la façon dont vous pouvez tester vos croyances rapidement avant d'aller public:Ressemble le coût par élément de la boucle approche est plus de TROIS fois celle de la
update
approche.À l'aide de
|= set()
coûte environ 1,5 x ceupdate
ne mais la moitié de ce que l'ajout de chaque élément individuel dans une boucle ne.Vous pouvez utiliser la fonction set() pour convertir un objet iterable dans un ensemble, et ensuite utiliser un ensemble standard de mise à jour de l'opérateur (|=) pour ajouter les valeurs uniques de votre nouveau jeu dans l'existant.
.update
a l'avantage que l'argument peut être n'importe quel itérable —pas nécessairement un ensemble— à la différence de l'ERS de la|=
opérateur dans votre exemple.|
de l'union,&
pour l'intersection, et^
pour obtenir des éléments qui sont dans l'un ou l'autre mais pas les deux. Mais dans un typées dynamiquement la langue où il est parfois difficile de lire le code et de connaître les types d'objets qui volent autour, je me sens hésité à utiliser ces opérateurs. Quelqu'un qui ne les reconnaissent pas (ou peut-être ne réalise même pas que Python permet, pour les opérateurs, comme ces) pourrait être confus et de penser un peu bizarre au niveau du bit ou de la logique des opérations sont en cours. Ce serait bien si ces opérateurs ont travaillé sur d'autres iterables, trop....update()
et d'ajouter des éléments dans une boucle. Constaté que.update()
a été plus rapide. J'ai ajouté mes résultats de cette réponse: stackoverflow.com/a/4046249/901641Rapide mise à jour, les horaires à l'aide de python 3:
résultats sont les suivants:
Utiliser compréhension de liste.
Court-circuiter la création de l'objet iterable à l'aide d'une liste par exemple 🙂
[Edit: raté la partie de la question]
Pour l'enregistrement, je pense que l'affirmation selon laquelle "Il devrait y avoir un, et de préférence seulement une façon évidente de le faire." est faux. Il fait une hypothèse que de nombreuses techniques d'esprit des gens faire, que tout le monde pense de même. Ce qui est évident pour une personne qui n'est pas évident pour un autre.
Je dirais que ma solution proposée est clairement lisible, et fait ce que vous demandez. Je ne crois pas qu'il existe des performances impliqués avec elle--même si j'avoue que j'ai peut-être raté quelque chose. Mais malgré tout cela, il pourrait ne pas être évident et est préférable à un autre développeur.
add
pasappend
aset.update(iterable)
boucles à C de vitesse alors quefor item in iterable: aset.add(item)
boucles à Python de vitesse, avec une méthode de recherche et un appel de méthode (aarrgghh!!) par article.