Python комбинаций с кортежами - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть список кортежей, один из двух элементов в кортежах - это число, я пытаюсь получить список всех кортежей, для которых сумма чисел будет равна c сумме. С комбинациями itertools я получаю только список чисел, а не список кортежей:

listInit= [("A",1), ("B",2),("C",3),("D",4)]

resultExpected=[ [("A",1),("D",4)], [("B",2),("C",3)] ] #target sum=5

Со следующим кодом:

listInit=[1,2,3,4]
result=[seq for i in range(len(listInit), 0, -1) for seq in itertools.combinations(listInit, i) if sum(seq) == 5]
print(result)

Я получаю:

result=[ (1,4), (2,3) ]

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

1 Ответ

0 голосов
/ 20 апреля 2020

Я бы разбил понимание списка, чтобы было проще следить за ходом вашего кода.

for seq in itertools.combinations(listInit, 2):
    print(seq)

=== Output: ===
(('A', 1), ('B', 2))
(('A', 1), ('C', 3))
(('A', 1), ('D', 4))
(('B', 2), ('C', 3))
(('B', 2), ('D', 4))
(('C', 3), ('D', 4))

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

for seq in itertools.combinations(listInit, 2):
    # seq is a tuple of tuples
    # so you want the second element of both outer tuples
    if seq[0][1] + seq[1][1] == 5:
        print(seq)

=== Output: ===
(('A', 1), ('D', 4))
(('B', 2), ('C', 3))

...