有效地从 Python 列表中删除非常接近的重复项

Mar*_*D43 6 python list duplicates python-2.7

背景
我的Python程序处理相对大量的数据,这些数据可以在程序中生成,也可以导入。然后对数据进行处理,在这些过程之一期间,数据被有意复制,然后进行操作,清除重复项,然后返回到程序以供进一步使用。我正在处理的数据非常精确(最多 16 位小数),将这种精度保持在至少 14dp 至关重要。然而,数学运算当然可以返回我的浮点数的轻微变化,这样两个值与 14dp 相同,但可能与 16dp 略有不同,因此意味着内置函数无法正确set()删除此类“重复项”(我使用这种方法可以对想法进行原型设计,但对于最终的程序来说并不令人满意)。我还应该指出,我很可能忽略了一些简单的事情!我只是有兴趣看看其他人想出了什么:)

问题:
从可能非常大的数据集中删除非常接近的重复项的最有效方法是什么?

我的尝试
我尝试将值本身舍入为 14dp,但这当然不能令人满意,因为这会导致更大的错误。我对这个问题有一个潜在的解决方案,但我不相信它尽可能高效或“Pythonic”。我的尝试包括查找与 x dp 匹配的列表条目的索引,然后删除匹配的条目之一。

预先感谢您的任何建议!如果您有任何需要澄清的地方,或者当然,如果我忽略了一些非常简单的事情(我可能正处于思考过度的阶段),请告诉我。

关于“重复”的说明
我的“重复”条目之一的示例:603.73066958946424、603.73066958946460,解决方案将删除这些值之一。

关于decimal.Decimal的注意事项:
如果保证所有导入的数据不存在一些接近重复的数据(它经常这样做),那么这可能会起作用。

F.X*_*.X. 5

如果您要处理大量数据,您确实需要使用 NumPy。我会这样做:

导入 NumPy :

import numpy as np
Run Code Online (Sandbox Code Playgroud)

生成 8000 个高精度浮点数(128 位足以满足您的目的,但请注意,我将 64 位输出转换为random128 只是为了伪造它。此处使用您的真实数据。):

a = np.float128(np.random.random((8000,)))
Run Code Online (Sandbox Code Playgroud)

查找舍入数组中唯一元素的索引:

_, unique = np.unique(a.round(decimals=14), return_index=True)
Run Code Online (Sandbox Code Playgroud)

并从原始(非舍入)数组中获取这些索引:

no_duplicates = a[unique]
Run Code Online (Sandbox Code Playgroud)