Как сложить два числа в списке?

каково решение этого Python 3?

Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice.

Пример:

Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]. 

используйте комбинации, чтобы объединить элементы вместе и найти сумму

Jean-François Fabre 10.04.2018 21:53

Согласовано. @ Jean-FrançoisFabre Python умеет делать только то, что вы ему приказываете. Я не знаю о таком комбинированном поиске, пока вы его не определите.

Michael 10.04.2018 21:55

Добро пожаловать в StackOverflow! Пожалуйста, прочтите эту документацию: Как мне задавать домашние задания и отвечать на них?

kmote 10.04.2018 21:57

@Michael: itertools.combinations взяты по 2 за раз без замены.

Prune 10.04.2018 22:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
13 022
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Эта функция перебирает все числа в списке и находит сумму с другими числами. Если сумма равна цели, возвращает индексы

def indices_sum(nums,target):
    for i in range(len(nums)):
        for j in range(i+1,len(nums)):
            if nums[i]+nums[j] == target: return(i,j)
Ответ принят как подходящий

используйте itertools.combinations, который объединяет элементы вашего списка в неповторяющиеся пары и проверяет, совпадает ли сумма. Если это так, распечатайте позиции терминов:

import itertools

integer_array = [2, 8, 4, 7, 9, 5, 1]
target = 10
for numbers in itertools.combinations(integer_array,2):
    if sum(numbers) == target:
        print([integer_array.index(number) for number in numbers])

почему вы использовали itertools.combinations (lst, 2)?

HasanShovon 10.04.2018 22:16

для создания неповторяющихся пар, как и просили.

Jean-François Fabre 10.04.2018 22:18

в тестовом примере: list = [3,3], target = 6, ваш код возвращает индекс [0,0], но ответ будет [0,1].

tulsi kumar 19.08.2019 13:15

@HasanShovon - itertools.combinations(lst,2) вернет индексы всех комбинаций двух чисел из массива lst, которые суммируются с целью. Если вы измените 2 на 3, itertools.combinations(lst,3) вернет индексы всех комбинаций из 3 чисел из массива lst, которые суммируются с целью.

user9652688 20.11.2019 22:17

Этот вопрос состоит из 2 частей:

  1. Получение 2 элементов в списке, которые соответствуют цели
  2. Получение значения их индекса

    def get_index_for_target (числа, цель):

    for x in nums:
        for y in nums:
            if x + y == target:
                return (nums.index(x), nums.index(y))
    

Основная проблема с решениями, тестирующими все возможные пары (с составными петлями или itertools.combinations), заключается в том, что это O (n ^ 2), поскольку вы в основном тестируете все возможные комбинации двух элементов среди n (есть n * (n-1) / 2 таких комбинации), пока не найдете подходящую.

Когда n велико, вам понадобится более эффективный алгоритм. Одна из возможностей - сначала отсортировать список (это O (n * log (n))), затем поиск решения может быть выполнен непосредственно в O (n), что дает вам решение в O (n * log (n) ).


Сначала мы сортируем список, затем добавляем первое (наименьшее) и последнее (наибольшее) значения. Если сумма слишком велика, мы можем удалить наибольшее значение. Если он слишком мал, мы удаляем самый маленький, пока не дойдем до точной суммы.

Мы можем использовать collection.deque для эффективного удаления значений в любом конце списка.

Чтобы получить индексы, мы сохраняем их помимо значений в кортежах.

from collections import deque


def find_target(values, target):

    dq = deque(sorted([(val, idx) for idx, val in enumerate(values)]))

    while True:
        if len(dq) < 2:
            raise ValueError('No match found')

        s =  dq[0][0] + dq[-1][0]

        if s > target:
            dq.pop()
        elif s < target:
            dq.popleft()  
        else:
            break
    return dq[0], dq[-1]



values = [23, 5, 55, 11, 2, 12, 26, 16]
target = 27

sol = find_target(values, target)

print(sol)
# ((11, 3), (16, 7))
# 11 + 16 == 27, indices 3 and 7

print(sol[0][1], sol[1][1])
# 3 7

Для каждой записи в списке проверьте, есть ли в списке какие-либо другие числа после этого числа, которые в сумме соответствуют цели. Поскольку a + b = target эквивалентно b = target - a, вы можете просто взять каждый элемент, посмотреть все числа после этого элемента и проверить, являются ли они целевым элементом. Если да, верните индексы.

for index,num in  enumerate(nums):
    if target-num in nums[index+1:]:
        return(index, nums.index(target-num))

Мы можем использовать указатели в начале и в конце списка, чтобы проверять каждый индекс по сумме двух чисел, выполняя цикл один раз.

def sumOfTwo(array, target):
    i = 0
    j = len(array) - 1
    while i < j:
      add = array[i] + array[j]
      if add == target:
        return True
      elif add < target:
        i += 1
      else:
        j -= 1
    return False 

input -> [1, 2, 3, 4] -> target: 6

 i->    <-j
[1][2][3][4]  if i + j = target return True 
              if i + j < target increase i
              else decrease j

Примечание: В крайнем случае, защита проверки перед циклом, если: цель - отрицательное значение, список пуст, цель - ноль.

Мы можем сделать следующее:

numbers = [2, 7, 11, 15]
target =9
for x in numbers:
    for y in numbers:
        if x+y==target:
            print(x,y)

Другие вопросы по теме