如果插入大量元组,如何在创建带条件的元组列表时减少执行时间或计算成本?
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 中有大量元组时,步骤 1 和 2 花费的时间太长 运行。
你能告诉我我哪里错了吗,或者是否有更有效的方法可以更好地执行?
我希望我已经很好地解释了我的问题。
示例:
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))
我以这两个元组列表为例:
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 中有大量元组时,步骤 1 和 2 花费的时间太长 运行。 你能告诉我我哪里错了吗,或者是否有更有效的方法可以更好地执行?
我希望我已经很好地解释了我的问题。
示例:
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))