加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 22:24:30 所属栏目:Python 来源:网络整理
导读:我有一个列表,其中每个项目是两个事件ID的组合: (这只是更大的对列表的一小部分) [10000381 10007121,10000381 10008989,10005169 10008989, 10008989 10023817,10005169 10043265,10008989 10043265, 10023817 10043265,10047097 10047137,10047097 100472

我有一个列表,其中每个项目是两个事件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笔记本电脑上工作(在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,29??114,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]
等等
等等
等等

括号中的每个数字都是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())包含您的最终结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读