Найти - Пользователи
Полная версия: Индексы чисел из списка, которые в сумме равны заданному числу
Начало » Python для новичков » Индексы чисел из списка, которые в сумме равны заданному числу
1
Foxhaven98
Помогите, пожалуйста, написать код. Вводится случайный список из цифр (цифры в списке могут дублироваться и длина списка не определена). Пользователь вводит число. И программа должна вывести индексы тех чисел из списка, которые в сумме дают заданное пользователем число. (Рассматриваем вариант, что в списке всегда будет содержаться такая комбинация)

Мне удалось добиться того, чтобы программа работала если в списке все числа уникальны, но я без понятия как это реализовать, если есть повторяющиеся числа.

P.S. Только начинаю учить язык, поэтому сильно не критикуйте

Вот код, который я смог написать:

nums = [2, 7, 11, 15] # числа приведены просто для примера
nums1 = nums
target = int(input("Введите число: "))

for i in nums:
for j in nums1:
if i + j == target:
b = nums.index(i)
c = nums.index(j)
print(c, b)

Допустим как только nums = двум тройкам, а пользователь вводит 6, то программа выводит (0, 0), а нужно (0, 1)
xam1816
 nums = [2, 6, 11, 15]
target = 17
# nums = [3, 3]
# target = 6
for n0, i in enumerate(nums, 0):
    for n1, j in enumerate(nums[n0 + 1:], n0 + 1):
        if i + j == target:
            print(n0, n1)

>>>
0 3
1 2

Process finished with exit code 0
py.user.next
xam1816 , да там одни единицы могут стоять в списке, а число может быть двадцать.

Вот пример, когда для 2 6 11 ничего не происходит.
  
>>> nums = [2, 6, 11, 15]
>>> target = 19
>>> 
>>> for n0, i in enumerate(nums, 0):
...     for n1, j in enumerate(nums[n0 + 1:], n0 + 1):
...         if i + j == target:
...             print(n0, n1)
... 
>>>
xam1816
py.user.next
Вот пример, когда для 2 6 11 ничего не происходит.

 import itertools
nums = [2, 6, 11, 15]
target = 19
def find_all(nums, target):
    out = []
    comb = (itertools.combinations(enumerate(nums), i) for i in range(2, len(nums)+1))
    for c in comb:
        for t in c:
            if sum(i[1] for i in t) == target:
                out.append([i[0] for i in t])
    return out
res = find_all(nums, target)
print(res)
>>>
[[0, 1, 2]]

Process finished with exit code 0
py.user.next
Разделил подготовку индексов и выбор индексов.
  
>>> import itertools
>>> 
>>> def find_all(nums, target):
...     out = []
...     length = len(nums)
...     seq = itertools.chain.from_iterable(
...         itertools.combinations(range(length), i)
...         for i in range(2, length + 1))
...     for t in seq:
...         if sum(nums[i] for i in t) == target:
...             out.append(t)
...     return out
... 
>>> find_all([2, 6, 11, 15], 19)
[(0, 1, 2)]
>>> 
>>> find_all([2, 2, 2, 2], 4)
[(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
>>> 
>>> find_all([2, 2, 2, 2], 6)
[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]
>>> 
>>> find_all([2, 6, 11, 15], 17)
[(0, 3), (1, 2)]
>>>

У тебя один кусок кода связан с другим куском кода (связан - значит, зависит от него; если первый убрать, то второй полностью развалится).
Я же отвязал эти куски друг от друга и благодаря этому оно теперь готово к дальнейшему выделению функций.

Пример
  
>>> import itertools
>>> 
>>> def find_all(nums, target):
...     seq = func1(nums, len(nums))
...     out = func2(nums, seq, target)
...     return out
... 
>>> def func1(seq, length):
...     out = itertools.chain.from_iterable(
...         itertools.combinations(range(length), i)
...         for i in range(2, length + 1))
...     return out
... 
>>> def func2(lst, seq, num):
...     out = []
...     for t in seq:
...         if sum(lst[i] for i in t) == num:
...             out.append(t)
...     return out
... 
>>> find_all([2, 6, 11, 15], 19)
[(0, 1, 2)]
>>> 
>>> find_all([2, 2, 2, 2], 4)
[(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
>>> 
>>> find_all([2, 2, 2, 2], 6)
[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]
>>> 
>>> find_all([2, 6, 11, 15], 17)
[(0, 3), (1, 2)]
>>>
func2() не знает, как собирались элементы в func1().
func2() не знает про существование func1().
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB