Java的TreeSet等同于Python?

2022-09-01 07:03:05

我最近遇到了一些Java代码,这些代码只是简单地将一些字符串放入Java TreeSet中,为其实现了基于距离的比较器,然后将其快乐的方式变成了日落,以计算给定的分数来解决给定的问题。

我的问题,

  • 是否有等效的数据结构可用于Python?

    • Java树集看起来基本上是一个有序字典,可以使用某种比较器来实现这种排序。
  • 我看到有一个Pep用于PaedDict的Py3K,但我使用的是2.6.x。有一堆有序的字典实现 - 特别是可以推荐的人吗?

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

我有点不确定如何将其集成到此处给出的有序字典链接中给出的顺序中..

像这样,

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

欢迎提出想法。


答案 1

Python 2.7 文档的集合。OrderedDict有一个指向在Python 2.4或更高版本上运行的OrderdDict配方的链接。

编辑:关于排序:使用而不是 .它往往会导致更快的代码,而且,关键字在Python3中已被消除。key=cmp=cmp=

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

您发布的代码没有明确说明您希望以 .下面,我假设x1应该是每个键对中的值。如果是这样,您可以执行如下操作:mycmpx1

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

key=...传递了一个函数 。对于 中的每个 ,lambda 函数返回数字 。就排序而言,此数字充当项目的代理。有关在Python中对习语进行排序的更多信息,请参阅本文lambda item: abs(item[1]-length)itemd.items()abs(item[1]-length)

PS.是一个Python内置函数。为了不吝啬,我把变量名改成了.lenlenlength


答案 2

我最近使用bisec模块为Python实现了TreeSet。

https://github.com/fukatani/TreeSet

它的用法类似于Java的Treeset。

前任。

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

推荐