Java's TreeSet equivalent in Python?
The Python 2.7 docs for collections.OrderedDict
has a link to a OrderedDict recipe that runs on Python 2.4 or better.
Edit: In regard to sorting: Use key=
rather than cmp=
. It tends to lead to faster code and moreover, the cmp=
keyword has been eliminated in Python3.
d={5:6,7:8,100:101,1:2,3:4}
print(d.items())
# [(1, 2), (3, 4), (100, 101), (5, 6), (7, 8)]
The code you posted for mycmp
doesn't make it clear what you want passed as x1
. Below, I assume x1 is supposed to be the value in each key-value pair. If so, you could do something like this:
length=4
print(sorted(d.items(),key=lambda item: abs(item[1]-length) ))
# [(3, 4), (1, 2), (5, 6), (7, 8), (100, 101)]
key=...
is passed a function, lambda item: abs(item[1]-length)
.
For each item
in d.items()
, the lambda function returns the number abs(item[1]-length)
. This number acts as proxy for the item as far as sorting is concerned. See this essay for more information on sorting idioms in Python.
PS. len
is a Python builtin function. So as to not clobber that len
, I've changed the variable name to length
.
I recently implemented TreeSet for Python using bisect module.
https://github.com/fukatani/TreeSet
Its usage is similar to 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
I'd need to see some example data, but if you're just trying to do a weighted sort, then the builtin python sorted() can do it, two ways.
With well ordered tuples and a key() function:
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
or with a class with a __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
Both of these return the same output:
('Moby Dick', 4000, 4.75)
('The Hobbit', 300, 7.25)
("Grey's Anatomy", 3000, 200)