python中基于比较的排序容器 来自C++背景,我错过了一个很好的排序容器,它只基于比较,不需要哈希。p>

python中基于比较的排序容器 来自C++背景,我错过了一个很好的排序容器,它只基于比较,不需要哈希。p>,python,containers,sorted,Python,Containers,Sorted,有人知道平衡树的一个很好的实现吗?或者(标准)库中是否有一个同样易于使用的替代排序容器 这是我现在尝试解决的用例: 有一个用三角形描述曲面的文件。每个三角形有三个节点,许多节点是相同的。我需要重建这个曲面,需要知道哪些节点是相同的。 不幸的是,在ASCII输入中,即使打印的浮点值属于同一个节点,它们之间有时也会有微小的差异。所以我不能用一个简单的文本比较来判断它们是否相等 在C++中,我的解决方案是用一个“软比较”来存储节点,用以处理节点之间的距离相等的“软比较”。然后,我可以在解析文件时添加节

有人知道平衡树的一个很好的实现吗?或者(标准)库中是否有一个同样易于使用的替代排序容器

这是我现在尝试解决的用例: 有一个用三角形描述曲面的文件。每个三角形有三个节点,许多节点是相同的。我需要重建这个曲面,需要知道哪些节点是相同的。 不幸的是,在ASCII输入中,即使打印的浮点值属于同一个节点,它们之间有时也会有微小的差异。所以我不能用一个简单的文本比较来判断它们是否相等

在C++中,我的解决方案是用一个“软比较”来存储节点,用以处理节点之间的距离相等的“软比较”。然后,我可以在解析文件时添加节点,并使用索引来构建曲面

但在Python中,我正努力以一种简单的方式同样有效地完成它

谢谢, 卢克



谢谢大家的贡献

致goncalopp: 排序不是一个好的选择,因为它是每个插入的O(n log(n))最坏情况。 对分也是如此。它在搜索时很好,但在插入时却不行。它维护一个不平衡的树,在最坏的情况下是O(n),然后下面的插入列表是O(n)

致亚伦: 我完全同意您的观点,目标是编写优雅的代码。对我来说,选择正确的容器(数据结构)通常是做到这一点的第一步。 你的解决方案是O(n),它比平衡树更快,非常好,我喜欢圆形()的技巧。我没有想到这一点,现在我意识到它可以在python中工作,因为int的精度是无限的。所以我将使用您的构造

至MrE: 感谢链接到bintree,它看起来像是我问题的解决方案(平衡树)。
我以前发现过BLIST,但是使用内部的DICT和哈希查找,所以没有用,但是BiTeple看起来好多了。C++中的

< P>,一切都是关于效率的。在Python中,美同样重要:Pythonians首先尝试找到一个优雅的算法,在少数情况下,它实际上太慢了,我们会花几分钟优化几行代码,使其足够快

在您的情况下,您需要找到彼此接近的点。一种方法是您描述的方法。以下是我将如何解决这个问题:

确定坐标需要多精确。你想要/需要/必须保留多少小数?1,2

读取输入时,将坐标截断或四舍五入到适当的小数位数,然后根据该小数位数创建元组键。现在,您可以使用标准Python字典:

def round(x):
    return int(round(x*100)) # Keep 2 decimal places, return int for precision (and speed)

filter = {}
filteredPoints = []
for x,y,z in points:
    x,y,z = round(x),round(y),round(z)
    key = (x,y,z)
    index = filter.get(key, None)
    if index is None:
        index = len(filteredPoints)
        filteredPoints.append(key)
        filter[key] = index

也许你可以对它进行排序,谢谢大家的贡献!致goncalopp: