Comment extraire le membre unique de l'ensemble des membres en python?
J'ai récemment rencontré un scénario dans lequel, si un jeu ne contenait qu'un seul élément, je voulais faire quelque chose avec cet élément. Pour récupérer l'élément, que j'ai installé sur cette approche:
element = list(myset)[0]
Mais ce n'est pas très satisfaisant, car elle crée une inutiles de la liste. Il pourrait également être fait avec de l'itération, mais itération semble artificiel, car il n'existe qu'un seul élément. Ai-je raté quelque chose de simple?
Vous devez vous connecter pour publier un commentaire.
Tuple déballage des œuvres.
(En passant, python-dev a exploré, mais a rejeté l'ajout de
myset.get()
retour à l'arbitraire d'un élément d'un ensemble. La Discussion ici, Guido van Rossum réponses Un et Deux.)Mon favori personnel pour obtenir de l'arbitraire d'un élément (lorsque vous avez un nombre inconnu, mais fonctionne également si vous avez un seul):
1: dans Python 2.5 et avant, vous devez utiliser
iter(myset).next()
element ,= myset
[element] = myset
next(iter(myset))
expression a l'avantage d'être utilisable sans affectation spéciale, de sorte que vous pouvez passer en argument à une fonction, par exemple.Entre faire un n-uplet et faire un itérateur, c'est presque un lavage, mais itération gagne par un nez...:
Ne sais pas pourquoi toutes les réponses sont à l'aide de l'ancienne syntaxe
iter(x).next()
plutôt que le nouveaunext(iter(x))
, ce qui me semble préférable (et fonctionne également en Python 3.1).Toutefois, le déballage gagne haut la main sur les deux:
Bien sûr, cela est pour un seul élément fixe (où la dernière forme, comme d'autres l'ont mentionné, a l'avantage d'échouer rapidement si l'ensemble vous "savait" avait un seul élément réellement eu plusieurs). Pour les ensembles arbitraires N > 1 éléments, le tuple ralentit, iter n'est pas le cas:
Donc, le déballage pour le singleton cas, et
next(iter(x))
pour le cas général, semblent être les meilleurs.python
est Python 2.5 sur mon système, et donc ce qui arrive lorsque je clique sur mon raccourci clavier pour ouvrir une console python.next(..)
est disponible dans la version 2.6 de Python, je comprends votre point beaucoup mieux! Que de bonnes nouvelles.Je pense kaizer.se en réponse est grande. Mais si votre pourrait contenir plus d'un élément, et que vous voulez un n'est pas si arbitraire, vous pouvez utiliser
min
oumax
. E. g.:ou:
(N'utilisez pas de
triés
, parce que cela a une surcharge inutile pour ce type d'utilisation.)Je suggère:
element = myset.copy().pop()
vous pouvez utiliser
element = tuple(myset)[0]
qui est un peu plus efficace, ou, vous pouvez faire quelque chose commeJe suppose que la construction d'un itérateur est plus efficace que la construction d'un tuple/liste.