Форум сайта python.su
0
Помогите, пожалуйста, написать код. Вводится случайный список из цифр (цифры в списке могут дублироваться и длина списка не определена). Пользователь вводит число. И программа должна вывести индексы тех чисел из списка, которые в сумме дают заданное пользователем число. (Рассматриваем вариант, что в списке всегда будет содержаться такая комбинация)
Мне удалось добиться того, чтобы программа работала если в списке все числа уникальны, но я без понятия как это реализовать, если есть повторяющиеся числа.
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)
Отредактировано Foxhaven98 (Фев. 26, 2022 21:27:09)
Офлайн
124
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
Офлайн
857
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) ... >>>
Офлайн
124
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
Офлайн
857
Разделил подготовку индексов и выбор индексов.
>>> 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)] >>>
Отредактировано py.user.next (Март 2, 2022 01:02:20)
Офлайн