Can it be made faster, and I am a newbie to complexity but I'm pretty sure the average case for this would be O(n). Am I wrong? Output for the first list should be: (1,9), (2,8), (5,5), (-11,21) #find pairs of an array whose sum is equal to ten #bonus do it im linear time list1 = [1,1,2,1,9,9,5,5,2,3,745,8,1,-11,21] list2 = [1,1,1,1,9,9,9,9,2,8,8,8,2,2,0,0,0] list3 = ["dog", "cat", "penguin", 9, 1] list4 = [] def find_pairs_sum_n(list1, n): set1 = set(list1) history = set() if not list1: print("list is empty") raise StopIteration if not all(isinstance(n, int) for n in list1): print("list must contain only integers") raise StopIteration for x in set1: history.add(x) if (n - x) in set1 and (n-x) not in history: yield (x, n - x) elif x == n/2 and list1.count(n/2) > 1: yield (int(n/2), int(n/2)) x = find_pairs_sum_n(list1, 10) for i in x: print(i) y = find_pairs_sum_n(list2, 10) for i in y: print(i) z = find_pairs_sum_n(list3, 10) print(next(z)) w = find_pairs_sum_n(list4, 10) print(next(w))