En Python, quelle est la "seule [...] façon évidente" d'ajouter tous les éléments d'un itérable à un ensemble existant?
Réponses
Trop de publicités? Pour le bénéfice de tous ceux qui pourraient croire, par exemple, que aset.add()
dans une boucle aurait des performances concurrentielles avec aset.update()
, voici un exemple de la façon dont vous pouvez tester vos convictions rapidement avant de devenir public:
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 1 msec per loop
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "for i in it:a.add(i)"
100 loops, best of 3: 3.16 msec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a.update(it)"
100 loops, best of 3: 1.97 msec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "for i in it:a.add(i)"
100 loops, best of 3: 6.39 msec per loop
On dirait que le coût par élément de la boucle est trois fois plus élevé que celui de la mise à jour.
Vous pouvez utiliser la fonction set () pour convertir un élément itérable en un ensemble, puis utiliser l'opérateur standard de mise à jour d'un ensemble (| =) pour ajouter les valeurs uniques de votre nouvel ensemble à celui existant.
>>> a = { 1, 2, 3 }
>>> b = ( 3, 4, 5 )
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])
for item in items:
extant_set.add(item)
Pour le record, 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.