У меня есть два отсортированных списка
x = [-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10]
y = [3,4,5,6]
Между этими x
и y
я хотел бы вернуть imin = (6,0)
и imax = (9,3)
.Если в этих списках нет общих элементов, я бы хотел вернуть imin = None
и imax = None
.
Решение:
def inds(x,y):
arr = [(i,j) for i,xx in enumerate(x) for j,yy in enumerate(y) if xx==yy ]
if arr!=[]: # to obtain proper None output
imin = (min(i for i,_ in arr), min(j for _,j in arr))
imax = (max(i for i,_ in arr), max(j for _,j in arr))
else:
imin = None
imax = None
return (imin,imax)
Это делает много ненужных вычислений (O (n ** 2)) и является узким местом одной из моих программ.Может кто-нибудь предложить что-нибудь быстрее?
ДОПОЛНИТЕЛЬНАЯ (НЕ МИНИМАЛЬНЫЙ ПРИМЕР) ИНФОРМАЦИЯ
Если это поможет, у меня фактически есть список объектов.
objects = [(A1,B1),(A2,B2)]
x
и y
будут атрибутами каждого элемента этого списка объектов следующим образом:
x = objects[0][0].attrib
y = objects[0][1].attrib
и я действительно хочу сгенерировать
[(imin1,imax1),(imin2,imax2)]
Что может быть, например, из
def attribs(A,B):
return (A.attrib,B.attrib)
[inds(*attribs(*v)) for v in objects]
примечание: я добавил тег numpy только потому, что я открыт для использования numpy для этого, если он быстрее.