Как сложить два элемента из одного списка и сравнить с целочисленным параметром - PullRequest
0 голосов
/ 08 октября 2019

Я пишу функцию, которая проверяет, равна ли сумма любых двух элементов в одном и том же списке целочисленному аргументу.

Например: для 17 и [10, 15, 3, 7] должно возвращаться значение True, поскольку 17 равно 10 + 7.

Для 17 и [10, 15, 4, 8], он должен возвращать False, так как в списке нет пары с суммой 17.

Я совершенно заблудился, как к этому подойти. Любая помощь приветствуется!

for i in range(0, len(lst) - 1):
    return k == lst[i] + lst[i]

return lst

Учитывая 17 и [10, 15, 3, 7], она должна вернуть True, поскольку 17 равно 10 + 7.

Учитывая 17 и [10,15, 4, 8], он должен возвращать False, так как в списке нет пары с суммой 17.

Ответы [ 4 ]

1 голос
/ 08 октября 2019
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() медленнее, чемвремя создать набор из того же списка, поэтому вышеупомянутое будет быстрее, чем это.

0 голосов
/ 08 октября 2019

Попробуйте это, братан

 def check(n,lst):
        for item in lst:
            temp = item
            for i in range(len(lst)):
                if lst.index(temp) != i: #This is to avoid comparison with the same index
                    if n == temp + lst[i]:
                        print("MATCH FOUND! ", temp, " and ", lst[i])
                        return True
                    else:
                        continue
0 голосов
/ 08 октября 2019
def checkSum(num, lst):
    for i in lst:
       for j in lst:
         if num==i + j:
            return True

return False

Этот способ не так эффективен, как предыдущий ответ, но это скорее подход грубой силы, сравнивающий сумму всех пар и просто проверяющий, удовлетворяют ли они условию.

0 голосов
/ 08 октября 2019
def check(n, lst):

    for i in lst:
        temp = lst.copy()
        temp.remove(i)
        if n-i in temp:
            return True
    return False


l = [10,6,7,5,10]

print(check(20,l))

это возвращает

True
...