Если вы хотите использовать понимание списка, вы можете сделать:
List1 = [(1,50,56),(1,61,69),(1,70,87),(1,90,99),(1,110,117),(1,119,126),(2,3,9), (2,11,17), (3,2,9)]
List2 = [(1,44,56),(1,59,64),(1,70,81),(1,84,90),(1,99,155), (2,5,15), (3,3,9)]
output = [(max(s1, s2), min(e1, e2)) for id1, s1, e1 in List1
for id2, s2, e2 in List2
if id1 == id2 and e2 >= s1 and s2 <= e1]
print(output)
Вывод:
[(50, 56), (61, 64), (70, 81), (84, 87), (90, 90), (99, 99), (110, 117), (119, 126), (5, 9), (11, 15), (3, 9)]
, который выглядит так же, как и в оригинале.Как правило, понимание списка происходит быстрее, чем стандартные циклы.
Понимание списка: 6,51 мкс ± 13,7 нс на цикл (среднее ± стандартное отклонение из 7 циклов, 100000 циклов в каждом)
Исходный цикл: 25,2 мкс ± 239 нс на цикл (среднее ± стандартное отклонение из 7 циклов, по 10000 циклов каждый)
(код сравнения "Original Loop" был:
output = []
for a1, s1, e1 in List1:
for a2, s2, e2 in List2:
sgroup = [s1, s2]
egroup = [e1, e2]
mstart = max(sgroup)
mend = min(egroup)
if a1 == a2 and e2>=s1 and s2<=e1:
output.append((mstart, mend))
)