2012-11-02 3 views
1

Je souhaite rechercher un élément dans un ensemble en Python. Comment puis-je obtenir l'indice de l'élément recherché dans le temps le plus rapide?Rechercher dans un ensemble

element in set ne donne pas d'indice! je veux savoir l'index de l'élément.

+9

les éléments d'un ensemble n'ont pas ** d'index! –

+1

Pourquoi avez-vous besoin d'un index? – SilentGhost

Répondre

7

Si vous êtes intéressé par l'index, sets ne maintient aucune commande.

De l'Docs:

Être une collection non ordonnée, ensembles ne position de l'élément ou pas enregistrer ordre d'insertion. Par conséquent, les ensembles ne prennent pas en charge l'indexation, le découpage en tranches ou tout autre comportement de type séquence.

Ou peut-être quelque chose comme ceci:

In [1]: se=set("foobarspampython") 

In [2]: se 
Out[2]: set(['a', 'b', 'f', 'h', 'm', 'n', 'o', 'p', 'r', 's', 't', 'y']) 

In [3]: list(se).index("f") # in the original string the index is 0, 
           # but list(set) returns something different 
Out[3]: 2 

Python 3.x:

Vous pouvez utiliser OrderedDict() 3.x python, et utilisez vos articles comme les clés du dict. dict.keys() renvoie keysView dans python 3.x qui est un peu similaire à sets, et vous pouvez effectuer toutes les opérations définies sur celui-ci.

>>> from collections import OrderedDict as od 
>>> strs="foobarspampython" 
>>> dic=od((x,"") for x in strs) 

>>> dic.keys()      #order is maintained 

KeysView(OrderedDict([('f', ''), ('o', ''), ('b', ''), ('a', ''), ('r', ''), 
         ('s', ''), ('p', ''), ('m', ''), ('y', ''), ('t', ''), 
         ('h', ''), ('n', '')])) 

>>> list(dic.keys()).index("f") 
0 
>>> list(dic.keys()).index("b") 
2 

>>> dic.keys() & {'a','b','c'} # even set operations work fine on it 
{'a', 'b'} 
+0

et l'index est complètement aléatoire dans ce que vous montrez! – SilentGhost

+0

@SilentGhost oui c'est complètement imprévisible ce que la commande va être. –

+0

@SilentGhost Je pense que python 3.x 'OrderedDict' peut être utilisé. Utiliser les éléments comme des clés avec des valeurs vides. Comme 'dict.keys()' renvoie un 'keysView().' Sur lequel nous pouvons effectuer des opérations set. –

2

Si vous avez besoin à la fois la possibilité d'accéder à l'index et rapide des recherches, vous devriez jeter un oeil à la (non standard) blist package. Il fournit une implémentation de liste rapide qui maintient l'ordre et permet ainsi un accès rapide. Ce ne sera pas aussi rapide qu'un set peut être, mais vous serez en mesure de récupérer des indices.

Questions connexes