我有一个列表,其中每个项目是两个事件ID的组合:
(这只是一个更大的配对列表的片段)
['100003811007121','1000038110008989','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”,
‘100003811066013’,‘1000712110066013’,‘1000898910066013’,
'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”,
'100003810187233'、'10056453 10187233'、'10060557 10187233',
“10066013 10187233”、“10083798 10187233”、“10099969 10187233”,
‘10167029 10187233’,‘10007121 10200685’,‘10099969 10200685’,
'10066013 10218005','10223905 10224013']
我需要找到每一个ID的每一个实例,并将其索引到一个新的列表中。现在我有几行代码可以帮我完成这项工作然而,我的列表超过2000000行,随着处理更多数据,列表将变得更大。
目前,预计完工时间约为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)

我想要的是这样的东西:
'100003811007121':[0]
'100003811008989':[1]
'10005169 10008989':[2384775,864173,1297105,1321798,1555094,1611064,2078015]
'10008989 10023817':[31321800]
'10005169 10043265':[429113864195129710611081]
[58641962078017]
'1000898910043265':[629114338477786419816110851840732078019]
'10023817 10043265':[7,86626,384780,504434,792690,864215,1297108,1321801,1489784,1524527,1555096,1595763,1611098,1840734,1841280,1929457,1943701,1983362,2093820,2139917,21684337]
等。
等。
等。
其中括号中的每个数字是idlist中该对的索引。
本质上,我希望它查看一对id值(即“100003811007121”),并遍历该列表,找到该对的每个实例,并记录该对出现的列表中的每个索引。我需要一个能做到这一点的东西。在较短的时间内。

最佳答案

为了减少O(n)的时间复杂度,可以使用collections.OrderedDict。因为它记住了插入的顺序,所以这些值的出现顺序与不同的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())包含最终结果。

10-06 04:03