Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 26, 2022 21:18:06

Foxhaven98
Зарегистрирован: 2022-02-26
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Индексы чисел из списка, которые в сумме равны заданному числу

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

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

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)

Отредактировано Foxhaven98 (Фев. 26, 2022 21:27:09)

Офлайн

#2 Фев. 26, 2022 22:59:02

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Индексы чисел из списка, которые в сумме равны заданному числу

 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

Офлайн

#3 Фев. 26, 2022 23:20:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Индексы чисел из списка, которые в сумме равны заданному числу

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)
... 
>>>



Офлайн

#4 Март 1, 2022 20:37:56

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Индексы чисел из списка, которые в сумме равны заданному числу

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

Офлайн

#5 Март 2, 2022 00:59:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Индексы чисел из списка, которые в сумме равны заданному числу

Разделил подготовку индексов и выбор индексов.

  
>>> 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().



Отредактировано py.user.next (Март 2, 2022 01:02:20)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version