Java 的 TreeSet 在 Python 中等效吗?
我最近遇到一些 Java 代码,它只是将一些字符串放入 Java TreeSet 中,为其实现一个基于距离的比较器,然后愉快地计算给定分数来解决给定问题。
我的问题是,
是否有可用于 Python 的等效数据结构?
- Java 树集基本上看起来是一个有序字典,可以使用某种比较器来实现这种排序。
我看到 OrderedDict 有一个 Py3K 的 PEP,但我我正在使用 2.6.x。有很多有序的 dict 实现 - 特别是有人可以推荐吗?
PS,只是补充一下 - 我可以可能导入 DictMixin 或 UserDict 并实现我自己的排序/有序字典,并通过比较器函数实现它 - 但这似乎有点矫枉过正。
谢谢。
更新。感谢您的回答。为了详细说明一下,假设我有一个比较函数,其定义如下(给定特定值 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
我有点不确定如何将其集成到有序 dict 此处给出的链接..。
诸如“想法”之类的东西
OrderedDict(sorted(d.items(), cmp=mycmp(len)))
将受到欢迎。
I recently came across some Java code that simply put some strings into a Java TreeSet, implemented a distance based comparator for it, and then made its merry way into the sunset to compute a given score to solve the given problem.
My questions,
Is there an equivalent data structure available for Python?
- The Java treeset looks basically to be an ordered dictionary that can use a comparator of some sort to achieve this ordering.
I see there's a PEP for Py3K for an OrderedDict, but I'm using 2.6.x. There are a bunch of ordered dict implementations out there - anyone in particular that can be recommended?
PS, Just to add - I could probably import DictMixin or UserDict and implement my own sorted/ordered dictionary, AND make it happen through a comparator function - but that seems to be overkill.
Thanks.
Update. Thanks for the answers. To elaborate a bit, lets say I've got a compare function thats defined like, (given a particular value 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
I'm a bit unsure about how I'd integrate this into the ordering given in the ordered dict link given here...
Something like,
OrderedDict(sorted(d.items(), cmp=mycmp(len)))
Ideas would be welcome.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
Python 2.7
collections.OrderedDict
< /a> 具有指向在 Python 2.4 或更高版本上运行的 OrderedDict 配方 的链接。编辑:关于排序:使用
key=
而不是cmp=
。它往往会导致更快的代码而且,cmp=
关键字在 Python3 中已被删除。您为
mycmp
发布的代码并未明确您想要作为x1
传递的内容。下面,我假设 x1 应该是每个键值对中的值。如果是这样,您可以执行如下操作:key=...
被传递给一个函数,lambda item:abs(item[1]-length)
。对于
d.items()
中的每个item
,lambda 函数返回数字abs(item[1]-length)
。就排序而言,该数字充当该项目的代理。有关 Python 中习惯用法排序的更多信息,请参阅本文。附言。
len
是一个 Python 内置函数。为了不破坏len
,我已将变量名称更改为length
。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 thancmp=
. It tends to lead to faster code and moreover, thecmp=
keyword has been eliminated in Python3.The code you posted for
mycmp
doesn't make it clear what you want passed asx1
. Below, I assume x1 is supposed to be the value in each key-value pair. If so, you could do something like this:key=...
is passed a function,lambda item: abs(item[1]-length)
.For each
item
ind.items()
, the lambda function returns the numberabs(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 thatlen
, I've changed the variable name tolength
.我最近使用 bisect 模块为 Python 实现了 TreeSet。
https://github.com/fukatani/TreeSet
其用法与Java的Treeset类似。
前任。
I recently implemented TreeSet for Python using bisect module.
https://github.com/fukatani/TreeSet
Its usage is similar to Java's Treeset.
ex.
我需要查看一些示例数据,但如果您只是尝试进行加权排序,那么内置的 python Sort() 可以通过两种方式做到这一点。
使用有序的元组和 key() 函数:
或者使用带有
__cmp__
运算符的类。这两个都返回相同的输出:
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:
or with a class with a
__cmp__
operator.Both of these return the same output:
1.
我不认为 python 有内置的排序集。
像这样的事情怎么样?
2.Java
TreeSet
是名为SortedSet
的抽象的实现。基本类型将按自然顺序排序。TreeSet
实例使用其compareTo(或compare)方法执行所有键比较。因此您的自定义键应该实现正确的compareTo
1.
I don't think python has a built-in Sorted sets.
How about something like this?
2.Java
TreeSet
is an implementation of the abstraction calledSortedSet
. Basic types will be sorted on natural order.ATreeSet
instance performs all key comparisons using its compareTo (or compare) method.So your custom keys should implement propercompareTo
如果您想要的是一个始终按排序顺序迭代的集合,这可能会帮助您实现大部分目标:
If what you want is a set that always iterates in sorted-order, this might get you most of the way there:
当您使用 java 树集时:
When you are coming with java treeset: