Quel est le "one [...] obvious way" pour ajouter tous les éléments d'un itérable à un existant set
?Python: comment ajouter le contenu d'un itérable à un ensemble?
Répondre
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])
J'aime cette façon:
set = [item for item in items]
@dolma, je ne veux pas créer * * un nouveau jeu, mais ajouter à une jeu existant. Désolé si ce n'était pas clair; J'ai édité la question pour clarifier. –
@dolma, aussi, (a) vous pouvez faire 's = set (items)' et (b) votre exemple redéfinit un built-in :) –
alors vous pouvez simplement faire 'set.extend ([élément de l'élément dans les éléments ]) ', Je suppose ... – dolma33
Utilisez la compréhension de la liste.
court-circuiter la création de itérables en utilisant une liste par exemple :)
>>> x = [1, 2, 3, 4]
>>>
>>> k = x.__iter__()
>>> k
<listiterator object at 0x100517490>
>>> l = [y for y in k]
>>> l
[1, 2, 3, 4]
>>>
>>> z = Set([1,2])
>>> z.update(l)
>>> z
set([1, 2, 3, 4])
>>>
[Edit: a raté la partie jeu de question]
Je ne vois aucun ensemble? Est-ce que je manque quelque chose? –
@Ian Mackinnon: Aah! Manqué ce point complètement. Merci. – pyfunc
for item in items:
extant_set.add(item)
Pour mémoire, je pense que l'affirmation selon laquelle « Il devrait y avoir One-- et de préférence qu'une seule façon --obvious de le faire. » est faux. Il fait une supposition que beaucoup de gens à l'esprit technique font, que tout le monde pense pareillement. Ce qui est évident pour une personne n'est pas si évident pour une autre.
Je dirais que la solution que je propose est clairement lisible et fait ce que vous demandez. Je ne crois pas qu'il y ait des problèmes de performance - même si j'avoue que je pourrais manquer quelque chose. Mais malgré tout cela, il pourrait ne pas être évident et préférable à un autre développeur.
Sets ont la méthode add aussi:
>>> 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])
Vous pouvez utiliser l'ensemble() pour convertir un itérable en un ensemble, et ensuite utiliser l'opérateur de mise à jour de jeu standard (| =) pour ajouter les valeurs uniques de votre nouvel ensemble dans l'existant.
>>> a = { 1, 2, 3 }
>>> b = (3, 4, 5)
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])
L'utilisation de '.update' a l'avantage que l'argument peut être n'importe quel itérable - pas nécessairement un ensemble - contrairement au RHS de l'opérateur' | = 'dans votre exemple. – tzot
Bon point. C'est juste un choix esthétique puisque set() peut convertir un itérable en un ensemble, mais le nombre de frappes est le même. – gbc
Je n'ai jamais vu cet opérateur auparavant, j'apprécierais de l'utiliser quand il apparaîtra dans le futur; Merci! – eipxen
Pour le bénéfice de toute personne qui pourrait croire par ex. que faire aset.add()
dans une boucle aurait performance compétitive avec faire aset.update()
, voici un exemple de la façon dont vous pouvez tester vos croyances rapidement avant d'aller public:
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 294 usec per loop
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 950 usec per loop
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 458 usec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 598 usec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 1.89 msec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 891 usec per loop
On dirait que le coût par élément de l'approche de la boucle est plus de trois fois celui de l'approche update
.
L'utilisation de |= set()
coûte environ 1,5 fois ce que update
fait mais la moitié de ce que fait chaque élément individuel dans une boucle.
Juste une rapide mise à jour, les horaires en utilisant Python 3:
#!/usr/local/bin python3
from timeit import Timer
a = set(range(1, 100000))
b = list(range(50000, 150000))
def one_by_one(s, l):
for i in l:
s.add(i)
def cast_to_list_and_back(s, l):
s = set(list(s) + l)
def update_set(s,l):
s.update(l)
résultats sont les suivants:
one_by_one 10.184448844986036
cast_to_list_and_back 7.969255169969983
update_set 2.212590195937082
- 1. valeurs à un ensemble Append en Python
- 2. Ajouter à un ensemble STL - C++
- 3. Ajouter ensemble - vba
- 4. Comment « Ajouter » deux octets ensemble
- 5. comment ajouter plusieurs octets ensemble?
- 6. Datastore datetimeproperty itérable?
- 7. Comment ajouter le contenu d'une carte à une autre carte?
- 8. Comment ajouter une classe à un contenu chargé avec jQuery
- 9. ajouter un autre ensemble Strings à TreeSet - java
- 10. Comment compter les éléments non-null dans un itérable?
- 11. Ajouter une date à un ensemble de données
- 12. Python: Comment ajouter un remplissage RSA?
- 13. Ajouter un objet à une liste python
- 14. Ajouter des éléments à sous-ensemble récursive
- 15. Comment ajouter des colonnes à sqlite3 python?
- 16. Comment rechercher et ajouter à un fichier binaire en python?
- 17. Django filtre bool pas itérable
- 18. Comment ajouter un délai à une fonction en Python
- 19. Comment ajouter un ensemble standard d'instructions 'using' dans VS?
- 20. Comment ajouter une tabulation à l'interpréteur Python?
- 21. Comment ajouter une propriété à un module dans boost :: python?
- 22. Être un sous-ensemble d'un dictionnaire Python
- 23. Comment hacher un grand objet (ensemble de données) en Python?
- 24. Comment ajouter deux équations COUNTIF ensemble?
- 25. Accédez à un sous-ensemble des fonctions d'une classe Python
- 26. Comment ajouter un ensemble d'éléments repeatbale dans jQuery?
- 27. Un lien Ajouter un espace dans le contenu
- 28. Ajouter un à un appel de fonction en python
- 29. Python: Liste à ajouter à un nombre unique?
- 30. Ajout d'un ensemble à un autre ensemble
Oui, je ne m'attendais pas à ce que ce soit ambigu, mais il semble que ce soit :) Mise à jour est la chose même. Je vous remercie! –
Je viens de revenir sur ma session d'interprétation et j'ai essayé, mais j'ai pensé qu'elle avait ajouté toute la liste en tant qu'élément de l'ensemble à cause des crochets dans la représentation de l'ensemble. Je n'avais jamais remarqué auparavant qu'ils sont représentés comme ça. –
Cette représentation vous permet de le coller directement dans une session interactive, car le constructeur 'set' prend un itérable comme argument. –