Java est TreeSet équivalent en Python?
Je suis récemment tombé sur certains de code Java qui a simplement mis quelques chaînes de caractères en Java TreeSet, mis en œuvre en fonction de la distance comparateur pour elle, et a ensuite fait son petit bonhomme de chemin dans le coucher du soleil pour le calcul d'un score donné pour résoudre le problème donné.
Mes questions,
- Est-il un équivalent de la structure de données disponibles pour Python?
- La Java treeset ressemble fondamentalement à un ordre dictionnaire pouvez utiliser un comparateur de quelque sorte pour réaliser cette commande.
- Je vois une PEP pour Py3K pour un OrderedDict, mais je suis en utilisant 2.6.x. Il y a un tas de commandé dict implémentations de là - bas- toute personne en particulier qui peut être recommandé?
PS, il suffit d'ajouter - je pourrait probablement d'importation DictMixin ou UserDict et de mettre en œuvre mes propres trier/a ordonné dictionnaire, ET de la rendre possible, par le biais d'un comparateur de fonction - mais qui semble être exagéré.
Grâce.
Mise à jour. Merci pour les réponses. Pour développer un peu, disons que j'ai une fonction de comparaison c'est défini comme, (étant donné une valeur particulière ln),
def mycmp(x1, y1, ln):
a = abs(x1-ln)
b = abs(y1-ln)
if a<b:
return -1
elif a>b:
return 1
else:
return 0
Je suis un peu incertain au sujet de comment je voudrais intégrer cela dans l'ordre donné dans la dict lien donné ici...
Quelque chose comme,
OrderedDict(sorted(d.items(), cmp=mycmp(len)))
Idées seraient les bienvenues.
OrderedDict
n'est pas comme Javas TreeMap
. Commandé ici signifie que les éléments sont classés par moment de l'insertion. Ce n'est pas ce que vous voulez. En gros, vous êtes à la recherche d'un ensemble mis en œuvre via des arbres binaires.OriginalL'auteur viksit | 2010-04-26
Vous devez vous connecter pour publier un commentaire.
Le Python 2.7 docs pour
collections.OrderedDict
a un lien vers un OrderedDict recette qui s'exécute sur Python 2.4 ou mieux.Edit: En ce qui concerne le tri: l'Utilisation
key=
plutôt quecmp=
. Il a tendance à conduire à plus rapide code et d'ailleurs, lescmp=
mot-clé a été éliminé en Python3.Le code que vous avez posté pour
mycmp
n'est pas clair ce que vous voulez passé commex1
. Ci-dessous, je suppose que x1 est censé être le valeur dans chaque paire clé-valeur. Si oui, vous pourriez faire quelque chose comme ceci:key=...
est passé à une fonction,lambda item: abs(item[1]-length)
.Pour chaque
item
dansd.items()
, le lambda de la fonction renvoie le nombreabs(item[1]-length)
. Ce numéro agit comme proxy pour l'article, comme beaucoup que le tri est concerné. Voir cet essai pour plus d'informations sur le tri des expressions idiomatiques en Python.PS.
len
est un Python builtin fonction. Afin de ne pas les fringues quelen
, j'ai changé le nom de la variable àlength
.génial, je pense que cela va faire exactement ce que je voulais, permettez-moi de le vérifier!
OriginalL'auteur unutbu
J'ai récemment mis en œuvre TreeSet pour Python en utilisant le traversent, module.
https://github.com/fukatani/TreeSet
Son utilisation est similaire à Java Treeset.
ex.
1 in ts
fonctionnalité.Merci! Je suis d'accord avec vous. J'ai mis en place TreeSet.__iter__. Si Ces fonctions sont comme suit. imprimer(1 à Treeset([1, 2])) >>> True print(3 en Treeset([1, 2])) >>> False for i in Treeset([2,5,2,3]): print(i)
Regarde grand - serais ravi de voir quelques tests.
Merci! J'ai ajouté des tests ici. https://github.com/fukatani/TreeSet/blob/master/test_treeset.py Et à l'amélioration de la 'dans' le rendement de l'opérateur à l'aide de bysect.
À la différence de Java
TreeSet
, l'insertion de la performance de cette mise en œuvre estO(n)
en raison de la nécessité de déplacer tous les éléments à partir de l'élément inséré.OriginalL'auteur fukatani
J'avais besoin de voir des données de l'exemple, mais si vous êtes juste essayer de faire une pondéré de la sorte, alors que le python triés() peut le faire de deux façons.
Avec bien ordonnée, tuples et une touche de fonction ():
ou avec une classe avec un
__cmp__
opérateur.Ces deux retournent le même résultat:
OriginalL'auteur bukzor
1.
Je ne pense pas que python est un construit-dans les ensembles classés.
Comment quelque chose comme cela?
2.Java
TreeSet
est une implémentation de l'abstraction appeléeSortedSet
. Types de base seront triées dans l'ordre naturel.UnTreeSet
instance effectue toutes les comparaisons clés à l'aide de son compareTo (ou de comparer les) méthode.Si votre personnalisées clés doivent mettre en œuvre correctecompareTo
OriginalL'auteur ring bearer
Si ce que vous voulez, c'est un jeu qui a toujours itère dans triés en ordre, cela peut vous procurer la plupart de la façon dont il:
OriginalL'auteur Matt Anderson