【问题标题】:Efficiently Removing Very-Near-Duplicates From Python List有效地从 Python 列表中删除非常接近的重复项
【发布时间】:2013-09-19 02:24:39
【问题描述】:

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

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

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

提前感谢您的任何建议!请让我知道您是否希望澄清任何事情,或者当然,如果我忽略了一些非常简单的事情(我可能正在考虑过度)。

澄清“重复”
我的“重复”条目之一的示例:603.73066958946424、603.73066958946460,该解决方案将删除其中一个值。

关于十进制.Decimal 的注释:
如果保证所有导入的数据没有一些近乎重复的数据(它经常这样做),这可能会起作用。

【问题讨论】:

  • 假设您对“接近”的定义是“差小于 2”。获取列表[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]。 “删除附近的重复项”应该怎么做?您对近似重复的定义需要是可传递的

标签: python list python-2.7 duplicates


【解决方案1】:

如果您要处理大量数据,您真的很想使用 NumPy。以下是我的做法:

导入 NumPy:

import numpy as np

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

a = np.float128(np.random.random((8000,)))

查找圆角数组中唯一元素的索引:

_, unique = np.unique(a.round(decimals=14), return_index=True)

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

no_duplicates = a[unique]

【讨论】:

    【解决方案2】:

    为什么不创建一个将 14dp 值映射到相应的完整 16dp 值的 dict:

    d = collections.defaultdict(list)
    
    for x in l:
        d[round(x, 14)].append(x)
    

    现在,如果您只想要“唯一”(根据您的定义)值,您可以这样做

    unique = [v[0] for v in d.values()]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2014-07-26
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多