python - 在> 2000000个项目的列表中查找重复项索引的快速方法

标签 python list duplicates

我有一个列表,其中每个项目都是两个事件 ID 的组合: (这只是更大的配对列表的一小部分)

['10000381 10007121', '10000381 10008989', '10005169 10008989', '10008989 10023817', '10005169 10043265', '10008989 10043265', '10023817 10043265', '10047097 10047137', '10047097 10047265', '10047137 10047265', '10000381 10056453', '10047265 10056453', '10000381 10060557', '10007121 10060557', '10056453 10060557', '10000381 10066013', '10007121 10066013', '10008989 10066013', '10026233 10066013', '10056453 10066013', '10056453 10070153', '10060557 10070153', '10066013 10070153', '10000381 10083798', '10047265 10083798', '10056453 10083798', '10066013 10083798', '10000381 10099969', '10056453 10099969', '10066013 10099969', '10070153 10099969', '10083798 10099969', '10056453 10167029', '10066013 10167029', '10083798 10167029', '10099969 10167029', '10182073 10182085', '10182073 10182177', '10182085 10182177', '10000381 10187233', '10056453 10187233', '10060557 10187233', '10066013 10187233', '10083798 10187233', '10099969 10187233', '10167029 10187233', '10007121 10200685', '10099969 10200685', '10066013 10218005', '10223905 10224013']

我需要找到每对 id 的每个实例并将其索引到一个新列表中。现在我有几行代码可以为我做这件事。但是,我的列表超过 2,000,000 行,并且随着我处理更多数据而变得更大。

目前,预计完成时间约为2天。

为此,我真的只需要一种更快的方法。

我正在使用 Jupyter Notebooks(在 Mac 笔记本电脑上)

def compiler(idlist):
    groups = []
    for i in idlist:
        groups.append([index for index, x in enumerate(idlist) if x == i])
    return(groups)

我也试过:

def compiler(idlist):
    groups = []
    for k,i in enumerate(idlist):
        position = []
        for c,j in enumerate(idlist):
            if i == j:
                position.append(c)
        groups.append(position)
    return(groups)

我想要的是这样的:

'10000381 10007121': [0]
'10000381 10008989': [1]
'10005169 10008989': [2, 384775, 864173, 1297105, 1321798, 1555094, 1611064, 2078015]
'10008989 10023817': [3, 1321800]
'10005169 10043265': [4, 29113, 864195, 1297106, 1611081]
[5, 864196, 2078017]
'10008989 10043265': [6, 29114, 384777, 864198, 1611085, 1840733, 2078019]
'10023817 10043265': [7, 86626, 384780, 504434, 792690, 864215, 1297108, 1321801, 1489784, 1524527, 1555096, 1595763, 1611098, 1840734, 1841280, 1929457, 1943701, 1983362, 2093820, 2139917, 2168437] ETC。 ETC。 等

其中括号中的每个数字是该对在 idlist 中的索引。

基本上,我希望它查看一对 id 值(即“10000381 10007121”),然后遍历列表并找到那对的每个实例并记录列表中的每个索引这对发生。我需要为列表中的每一项执行此操作的东西。在更短的时间内。

最佳答案

您可以使用 collections.OrderedDict为了将时间复杂度降低到O(n)。因为它会记住插入的顺序,所以值类似于各种 ID 的出现顺序:

from collections import OrderedDict

groups = OrderedDict()
for i, v in enumerate(idlist):
    try:
        groups[v].append(i)
    except KeyError:
        groups[v] = [i]

然后 list(groups.values()) 包含您的最终结果。

关于python - 在> 2000000个项目的列表中查找重复项索引的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53998673/

相关文章:

python - Pandas 数据框中的文本拆分列表

Python 比较 2 个列表是否有重复项

MySQL查询查找不存在且具有多个重复值的记录

mysql - 向数据库插入数据时出现重复条目​​错误

python - 使用 python 应用程序打包 OpenCV

python - 删除 pandas 数据框中的列会删除父数据框中的列

python - 如何在 Debian 服务器上升级 python?

python - Python中导入模块后的别名变量的行话是什么?

python - 使列表与另一个列表 python 完全匹配

duplicates - Apache Pulsar 中的重复数据删除如何工作?