Нахождение пары чисел в списке, который суммируется с целевым числом - PullRequest
0 голосов
/ 20 октября 2019

Назначение, над которым я работаю, указывает на написание функции с именем sum_pairs, которая принимает список и число и возвращает первую пару чисел, которые суммируются с переданным числом.

Это желаниярезультат:

sum_pairs([4,2,10,5,1], 6) # [4,2]

Единственный способ завершить это - использовать случайный модуль:

def sum_pairs(lst, num):
    rand_num_one = choice(lst)
    rand_num_two = choice(lst)
    if rand_num_one + rand_num_two == num:
        x = [rand_num_one, rand_num_two]
        return x

Однако я знаю, что есть другой способ сделать это без необходимости использоватьслучайный модуль. Я просто не могу понять это. Любая идея будет принята с благодарностью.

Ответы [ 4 ]

2 голосов
/ 20 октября 2019

Для полноты картины, вот решение с O(n) для сложности времени:

def find_pair(values, total):
  known = set()
  for value in values:
    if total - value in known:
      return value, total - value
    known.add(value)
1 голос
/ 20 октября 2019

почему вы используете random? вам нужно вернуть первую сумму

def sum_pairs(lst, num):
    for i in range(len(lst)):
        for j in range(i+1, len(lst)):
            if lst[i] + lst[j] == num:
                return lst[i],lst[j]

Обновление

Если вы хотите использовать модуль random, вы можете сделать это:

def sum_pairs(lst, num):
    first = choice(lst)
    temp = lst[::]
    temp.remove(first)
    second = choice(temp)
    while first + second != num:
        first = choice(lst)
        temp = lst[::]
        temp.remove(first)
        second = choice(temp)
    return first,second

, но этоне совсем ответ на ваш вопрос

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

Чтобы перебрать все возможные пары (без повторов), вы можете использовать itertools.combinations(p,r):

import itertools

def sum_pairs(lst, total_sum):
    for el in itertools.combinations(lst, 2):
        if(sum(el)==total_sum):
            return el
    return None

print(sum_pairs([4,2,10,5,1], 6))
print(sum_pairs([4,2,10,5,1], 16))
print(sum_pairs([4,2,10,5,1], 3))
print(sum_pairs([4,2,10,5,1], 2))

Выход:

(4, 2)
None                                                        
(2, 1)                                                      
None                                                        
[Program finished]
0 голосов
/ 20 октября 2019

Более эффективный метод, который требует только O (n) во временной сложности, будет использовать collections.Counter для создания счетчика для данного списка, так что вы можете перебирать ключи и проверятьесли число, которое будет добавлено с текущим номером к целевому номеру, имеет счетчик больше 0, или если это число совпадает с текущим числом, больше 1, в этот момент вы можете вывести как текущее число, так и егоаналог:

from collections import Counter
def sum_pairs(lst, target):
    counts = Counter(lst)
    return next(
        [num, target - num] for num in counts
        if counts.get(target - num, 0) > (target - num == num)
    )

так что:

sum_pairs([4,2,10,5,1], 6)

возвращает:

[4, 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...