def check(n, lst):
lst_set = set(lst)
for i in lst:
if (n-i) in lst_set:
if (n-i) != i: # check to see if it returned itself (not a pair)
return True
return False
Здесь у вас есть n
в качестве номера цели, а затем lst
в качестве ввода.
Сначала вы конвертируете ввод в набор для ускорения поиска, а затем для каждого, который вы беретеномер вашей цели, вычтите ваш текущий номер и посмотрите, есть ли он в наборе. Если это так, то у вас есть ответ True
, а если нет, переходите. Если вы дойдете до конца, не найдя его, то не вернетесь и вернете False
. Основная идея заключается в том, что когда вы берете номер своей цели и вычитаете номер, на котором находитесь сейчас, вы получаетеномер нужно сделать пару. Таким образом, вы проверяете свой набор, чтобы увидеть, существует ли этот номер в нем. Вам не нужно проходить каждую потенциальную пару таким образом.
Редактировать: Если вы хотите обрабатывать дублирующиеся входы, вы можете построить набор по ходу, что будетмедленнее, чем приведенный выше ответ, который не может обработать дублирующиеся входные данные, но все равно будет очень быстрым по сравнению с реализациями без хеш-таблиц.
def check_withdup(n, lst):
lst_set = set() # start with blank set
for i in lst:
if (n-i) in lst_set: # if it is in there, it wasn't itself so it is a pair
return True
else:
lst_set.add(i) # if it isn't in there, add it in
return False
Это будет работать за одну итерацию, но время для set.add()
медленнее, чемвремя создать набор из того же списка, поэтому вышеупомянутое будет быстрее, чем это.