Java's TreeSet-Äquivalent in Python?

Ich habe vor kurzem auf einige Java-Code, die einfach einige Strings in ein Java TreeSet, implementiert eine Distanz basierte Komparator für sie, und dann machte seine fröhliche Weg in den Sonnenuntergang, um eine gegebene Punktzahl zu berechnen, um das gegebene Problem zu lösen.

Meine Fragen,

  • Gibt es eine gleichwertige Datenstruktur für Python?

    • Das Java-Bäume sieht grundsätzlich ein geordnetes Wörterbuch aus, das einen Komparator irgendwelcher Art verwenden kann, um diese Bestellung zu erreichen.
  • Ich sehe, es gibt einen PEP für Py3K für einen OrderedDict, aber ich benutze 2.6.x. Es gibt eine Reihe von bestellten Dict-Implementierungen da draußen – jeder, der besonders empfohlen werden kann?

PS, nur um hinzuzufügen – ich könnte wahrscheinlich importieren DictMixin oder UserDict und implementieren Sie meine eigenen sortierten / geordneten Wörterbuch, und machen es geschehen durch eine Komparator-Funktion – aber das scheint übertrieben zu sein.

Vielen Dank.


Aktualisieren. Danke für die Antworten. Um ein bisschen zu erarbeiten, lasst uns sagen, ich habe eine Vergleichsfunktion, die wie folgt definiert ist (bei einem bestimmten Wert 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 

Ich bin ein bisschen unsicher darüber, wie ich das in die Bestellung eintragen werde, die in der bestellten Dict- Link gegeben wurde .

Etwas wie,

 OrderedDict(sorted(d.items(), cmp=mycmp(len))) 

Ideen wäre willkommen.

5 Solutions collect form web for “Java's TreeSet-Äquivalent in Python?”

Die Python 2.7 docs für collections.OrderedDict hat einen Link zu einem OrderedDict Rezept , das auf Python 2.4 oder besser läuft.

Bearbeiten: In Bezug auf Sortierung: Verwenden Sie key= anstatt cmp= . Es neigt dazu, zu schnelleren Code zu führen und darüber hinaus wurde das cmp= Keyword in Python3 eliminiert.

 d={5:6,7:8,100:101,1:2,3:4} print(d.items()) # [(1, 2), (3, 4), (100, 101), (5, 6), (7, 8)] 

Der Code, den du für mycmp gepostet mycmp macht nicht klar, was du als x1 mycmp möchtest. Unten, ich nehme an, x1 soll der Wert in jedem Schlüssel-Wert-Paar sein. Wenn ja, könnte man so etwas machen:

 length=4 print(sorted(d.items(),key=lambda item: abs(item[1]-length) )) # [(3, 4), (1, 2), (5, 6), (7, 8), (100, 101)] 

key=... wird eine Funktion übergeben, lambda item: abs(item[1]-length) . Für jede item in d.items() gibt die Lambda-Funktion die Zahl abs(item[1]-length) . Diese Nummer fungiert als Proxy für den Artikel, soweit Sortierung betroffen ist. Weitere Informationen zum Sortieren von Redewendungen in Python finden Sie in diesem Aufsatz .

PS len ist eine Python-Funktion. Also, um nicht zu vermitteln, dass len , habe ich den Variablennamen zu length geändert.

Ich müsste einige Beispieldaten sehen, aber wenn du nur versuchst, eine gewichtete Art zu machen, dann kann die eingebaute Python-Sortierung () das machen, zwei Wege.

Mit gut bestellten Tupeln und einer Key () Funktion:

 def cost_per_page(book): title, pagecount, cost = book return float(cost)/pagecount booklist = [ ("Grey's Anatomy", 3000, 200), ('The Hobbit', 300, 7.25), ('Moby Dick', 4000, 4.75), ] for book in sorted(booklist, key=cost_per_page): print book 

Oder mit einer Klasse mit einem __cmp__ Operator.

 class Book(object): def __init__(self, title, pagecount, cost): self.title = title self.pagecount = pagecount self.cost = cost def pagecost(self): return float(self.cost)/self.pagecount def __cmp__(self, other): 'only comparable with other books' return cmp(self.pagecost(), other.pagecost()) def __str__(self): return str((self.title, self.pagecount, self.cost)) booklist = [ Book("Grey's Anatomy", 3000, 200), Book('The Hobbit', 300, 7.25), Book('Moby Dick', 4000, 4.75), ] for book in sorted(booklist): print book 

Beide geben die gleiche Ausgabe zurück:

 ('Moby Dick', 4000, 4.75) ('The Hobbit', 300, 7.25) ("Grey's Anatomy", 3000, 200) 

Ich habe vor kurzem TreeSet für Python mit dem Bisect-Modul implementiert.

https://github.com/fukatani/TreeSet

Seine Verwendung ähnelt Java's Treeset.

Ex.

 from treeset import TreeSet ts = TreeSet([3,7,2,7,1,3]) print(ts) >>> [1, 2, 3, 7] ts.add(4) print(ts) >>> [1, 2, 3, 4, 7] ts.remove(7) print(ts) >>> [1, 2, 3, 4] print(ts[2]) >>> 3 

1. Ich glaube nicht, dass python hat eine eingebaute Sorted Sets. Wie wäre es mit so etwas?

 letters = ['w', 'Z', 'Q', 'B', 'C', 'A'] for l in sorted(set(letters)): print l 

2.Java TreeSet ist eine Implementierung der Abstraktion namens SortedSet . Basistypen werden auf natürlicher Reihenfolge sortiert. Eine TreeSet Instanz führt alle Key-Vergleiche mit ihrem CompareTo (oder Compare) -Methode aus. Zu Ihren benutzerdefinierten Schlüsseln sollte das richtige compareTo implementiert compareTo

Wenn das, was Sie wollen, ein Satz ist, der immer in sortierter Reihenfolge iteriert, könnte dies Sie am meisten von dort erreichen:

 def invalidate_sorted(f): def wrapper(self, *args, **kwargs): self._sort_cache = None return f(self, *args, **kwargs) return wrapper class SortedSet(set): _sort_cache = None _invalidate_sort_methods = """ add clear difference_update discard intersection_update symmetric_difference_update pop remove update __iand__ __ior__ __isub__ __ixor__ """.split() def __iter__(self): if not self._sort_cache: self._sort_cache = sorted(set.__iter__(self)) for item in self._sort_cache: yield item def __repr__(self): return '%s(%r)' % (type(self).__name__, list(self)) for methodname in _invalidate_sort_methods: locals()[methodname] = invalidate_sorted(getattr(set, methodname)) 
  • Python in Java anrufen?
  • Gute Sprache, um einen Spielserver zu entwickeln?
  • Konvertieren von CSV-Dateien in LIBSVM-kompatible Datendatei mit python
  • Was bedeutet dieser Fehler (SimpleHttpConnectionManager wird falsch verwendet)?
  • PKI-Verifikation über Java und Python
  • Holen Sie sich Daten von Jython Scripts mit JSR-223
  • Äquivalent für Pythons Lambda-Funktionen in Java?
  • Können Java und Python in der gleichen App koexistieren?
  • Warum werden die Daten ab dem 1. Januar 1970 berechnet?
  • Ziehen Sie Java-Fehler-Stacks aus Protokolldateien heraus
  • Java: Kein Endpunkt gefunden, aber python funktioniert
  • Python ist die beste Programmiersprache der Welt.