190 votes

Python: comment ajouter du contenu itérable à définir?

En Python, quelle est la "seule [...] façon évidente" d'ajouter tous les éléments d'un itérable à un ensemble existant?

264voto

IfLoop Points 59461

par ensemble, voulez-vous dire set ?

 >>> foo = set(range(0, 4))
>>> foo
set([0, 1, 2, 3])
>>> foo.update(range(2, 6))
>>> foo
set([0, 1, 2, 3, 4, 5])
 

50voto

John Machin Points 39706

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.

17voto

gbc Points 4019

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])
 

0voto

bigjim Points 492

Les ensembles ont aussi la méthode add:

 >>> s=set([1,2,3,4])
>>> for n in range(10):
        s.add(n)
>>> s
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
 

-2voto

jaydel Points 5968
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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X