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)) 
  • Löschen von Dateien aus einem ZIP-Archiv ohne Dekomprimierung in Java oder vielleicht Python
  • Java vs Python auf Hadoop
  • Was ist der beste Weg, um Java-Code von Python aufzurufen?
  • Wie man Java-Programm mit Python unter Berücksichtigung von Ein- und Ausgängen ausführen
  • Ich suche eine Klärung über scheinbare Widersprüche in schwach typisierte Sprachen
  • Warum gibt es keine endliche Wiederholung in der Lookbehind-Arbeit in einigen Aromen?
  • Python-Steckdose und Steckdose anschließen
  • Bibliothek zur Manipulation von S-Record und Intel HEX 16 Dateien
  • Holen Sie sich die gleiche Schicht links in Python als Java
  • TypeError: nextDouble (): self arg kann nicht zu java.util.Random gezwungen werden
  • Leistungsvergleich von Thrift, Protocol Puffer, JSON, EJB, anderen?
  • Python ist die beste Programmiersprache der Welt.