如果插入大量元组,如何在创建带条件的元组列表时减少执行时间或计算成本?

How do I reduce the execution time or computational cost when creating a list of tuples with conditions, if I insert a large number of tuples?

我以这两个元组列表为例:

l1 = [(3364, 183, 8619),
      (8077, 124, 6142),
      (3776, 166, 7385),
      (8874, 11, 9453),
      (12917, 225, 12433),
      (2567, 54, 8188),
      (11919, 82, 2062),
      (10698, 108, 12151)]

第二个列表:

l2 = [(3364, 183, 20),
      (8077, 124, 21),
      (3776, 166, 22),
      (8874, 11, 23),
      (12917, 225, 24),
      (2567, 54, 25),
      (11919, 82, 26),
      (10698, 108, 27)]

1 - 我通过执行以下条件从两个列表创建一个具有“列表理解”的新列表,即对于列表中的每个元组,元组的第一个元素相等对于第二个列表中每个元组的第一个元素,我可以插入值 p [0]、p [1](第一个列表的)和第二个列表的 n [0], 实际上:

new_list = list(set([(p[0],p[1],n[2]) for n in l2 for p in l1 if p[0] == n[0]]))

2 - 然后我将三元组分解成一个列表:

new_list = [n for n2 in new_list for n in n2]

3 - 我将元组分解为一个列表,因为稍后我将通过从该列表中随机选择值来创建一个数组,即 .:

new_elements = np.random.choice(new_list, size =512)

有什么问题吗?

当列表 l1 和 l2 中有大量元组时,步骤 12 花费的时间太长 运行。 你能告诉我我哪里错了吗,或者是否有更有效的方法可以更好地执行?

我希望我已经很好地解释了我的问题。

示例:

 l1 = [(10,11,2),             l2 = [(10,11,3),
       (9,10,4)]                    (9,10,5)]

之后:

new_list = list(set([(p[0],p[1],n[2]) for n in l2 for p in l1 if p[0] == n[0]]))

输出:

new_list = [(10,11,3),
            (9,10,5)]

我们可以使用字典来索引您的 p[0]n[0]

d1 = {p[0]: p[1] for p in l1}
d2 = {n[0]: n[2] for n in l2}

这里我删除了 p[2]n[1],因为它们与以后的步骤无关。

然后我们按照您的要求求出两个键的交集

intersection = d1.keys() & d2.keys()

最后根据步骤 3

的需要构建 new_list
new_list = list(intersection) + list(map(d1.get, intersection)) + list(map(d2.get, intersection))