Supposons ce qui suit :
>>> s = set([1, 2, 3])
Comment obtenir une valeur (n'importe quelle valeur) à partir de s
sans faire s.pop()
? Je veux laisser l'élément dans l'ensemble jusqu'à ce que je sois sûr de pouvoir le retirer - ce dont je ne peux être sûr qu'après un appel asynchrone à un autre hôte.
Rapide et sale :
>>> elem = s.pop()
>>> s.add(elem)
Mais connaissez-vous un meilleur moyen ? Idéalement en temps constant.
22 votes
Quelqu'un sait-il pourquoi cette fonction n'est pas déjà implémentée dans Python ?
5 votes
Quel est le cas d'utilisation ? Set n'a pas cette capacité pour une raison. Vous êtes censé itérer à travers lui et faire des opérations liées à l'ensemble comme
union
etc. sans en tirer des éléments. Par exemplenext(iter({3,2,1}))
retourne toujours1
donc si vous pensiez que cela renverrait un élément aléatoire - ce ne serait pas le cas. Alors peut-être que vous utilisez la mauvaise structure de données ? Quel est le cas d'utilisation ?1 votes
En rapport : stackoverflow.com/questions/20625579/ (Je sais, ce n'est pas la même question, mais il y a là des alternatives et des idées intéressantes).
1 votes
@hlin117 Parce que l'ensemble est un collection non ordonnée . Puisqu'aucun ordre n'est attendu, il n'y a aucun sens à récupérer un élément à une position donnée - on s'attend à ce qu'il soit aléatoire.
0 votes
@hlin117 Alors pourquoi cela n'a aucun sens ? Cela s'appelle "dessiner avec remplacement"...
0 votes
Je pense que le problème est que les valeurs ne sont pas renvoyées au hasard et qu'ils ne veulent donc pas donner l'impression qu'elles le sont. Le caractère aléatoire réel serait probablement trop lourd à gérer. Mais quand même, à des fins de test, il serait simple d'avoir une certaine
.get()
fonction ou alors...1 votes
B = (a-set()).pop()
0 votes
@Necho : I amour celui-là ! On pourrait aussi le faire :
set(a).pop()
?0 votes
@DarenThomas Je ne suis pas un expert de Python. Ce que je sais c'est qu'en utilisant set(a) la complexité temporelle est O(len(a)) donc c'est la même que copy(). Dans le cas de la différence s-t la complexité temporelle est O(len(t)) qui dans mon exemple est zéro, mais peut-être qu'en interne l'opération (...).pop() crée une copie, je ne sais pas. C'est quelque chose qu'un expert pourrait nous dire :)